我有一个目录充满文件对。每对文件与mp3和cdg(卡拉OK文件!)的扩展名具有相同的名称。我想用PowerShell来获取所有不同的文件名列表中没有扩展在PowerShell中的列表的每个元素上运行一个函数
我就得到:
dir -recurse -filter "*.mp3" | select-object Name | sort
但我不能完全弄清楚如何通过每个名称到[System.IO.Path] :: GetFileNameWithoutExtension
我该怎么做?
我有一个目录充满文件对。每对文件与mp3和cdg(卡拉OK文件!)的扩展名具有相同的名称。我想用PowerShell来获取所有不同的文件名列表中没有扩展在PowerShell中的列表的每个元素上运行一个函数
我就得到:
dir -recurse -filter "*.mp3" | select-object Name | sort
但我不能完全弄清楚如何通过每个名称到[System.IO.Path] :: GetFileNameWithoutExtension
我该怎么做?
您正在寻找的是for-each(%)过滤器(不确定它是否是过滤器或cmdlet,但它具有相同的使用语法)。
请尝试以下
dir -recurse -filter "*.mp3" |
%{ $_.Name } |
%{ [IO::Path]::GetFileNameWithoutExtension($_) } |
sort
编辑更新
我改变了我的答案从 “select-object Name
” 到 “%{ $_.Name}
”。前者基本上将Name属性从管道值中取出,并用原始对象上的值创建具有指定名称的单个属性的新对象。后者将处理管道中的每个值,并将执行$_.Name
的结果传递给管道。
如果您不喜欢像我一样打字%{$ _ foo},请尝试从PSCX获取Get-PropertyValue(别名:gpv)。
更多的思索这里的适当怪异:http://richardberg.net/blog/?p=55
DIR -recurse -filter “* .MP3” |选择@ {name ='Name'; Expression = {[System.IO.Path] :: GetFileNameWithoutExtension($ _。Name)}} |排序
+1。许多人忘记了select的“散列表语法”。太糟糕了,真是太难看了。会更好地写出select @ {Name = {some-expression},Path = {some-otherexpression}} –
Agreed Richard。 – JasonMArcher
现在的PowerShell v2是RTMd,您可以选择基名成员:
DIR -recurse -filter * .MP3 |选择BaseName |排序
这有效,但a)它给了我类似于:@ {Name = Mr. Bungle - Backstrokin' - 我该如何摆脱@ {Name = part?和b)我刚刚做了什么? –
@George,我更新了我的答案以摆脱@Name部分。我将添加一个响应,为什么会发生这种情况 – JaredPar
太棒了,谢谢 –