2009-08-05 75 views
3

我有一个目录充满文件对。每对文件与mp3和cdg(卡拉OK文件!)的扩展名具有相同的名称。我想用PowerShell来获取所有不同的文件名列表中没有扩展在PowerShell中的列表的每个元素上运行一个函数

我就得到:

dir -recurse -filter "*.mp3" | select-object Name | sort 

但我不能完全弄清楚如何通过每个名称到[System.IO.Path] :: GetFileNameWithoutExtension

我该怎么做?

回答

6

您正在寻找的是for-each(%)过滤器(不确定它是否是过滤器或cmdlet,但它具有相同的使用语法)。

请尝试以下

dir -recurse -filter "*.mp3" | 
    %{ $_.Name } | 
    %{ [IO::Path]::GetFileNameWithoutExtension($_) } | 
    sort 

编辑更新

我改变了我的答案从 “select-object Name” 到 “%{ $_.Name}”。前者基本上将Name属性从管道值中取出,并用原始对象上的值创建具有指定名称的单个属性的新对象。后者将处理管道中的每个值,并将执行$_.Name的结果传递给管道。

+0

这有效,但a)它给了我类似于:@ {Name = Mr. Bungle - Backstrokin' - 我该如何摆脱@ {Name = part?和b)我刚刚做了什么? –

+0

@George,我更新了我的答案以摆脱@Name部分。我将添加一个响应,为什么会发生这种情况 – JaredPar

+0

太棒了,谢谢 –

2

如果您不喜欢像我一样打字%{$ _ foo},请尝试从PSCX获取Get-PropertyValue(别名:gpv)。

更多的思索这里的适当怪异:http://richardberg.net/blog/?p=55

4

DIR -recurse -filter “* .MP3” |选择@ {name ='Name'; Expression = {[System.IO.Path] :: GetFileNameWithoutExtension($ _。Name)}} |排序

+1

+1。许多人忘记了select的“散列表语法”。太糟糕了,真是太难看了。会更好地写出select @ {Name = {some-expression},Path = {some-otherexpression}} –

+0

Agreed Richard。 – JasonMArcher

2

现在的PowerShell v2是RTMd,您可以选择基名成员:

DIR -recurse -filter * .MP3 |选择BaseName |排序

相关问题