在powershell中对列表的每个元素运行一个函数

时间:2009-08-05 18:20:34

标签: powershell

我有一个充满文件对的目录。每对文件都有相同的名称,扩展名为mp3和cdg(卡拉OK文件!)。我想使用powershell来获取没有扩展名的所有不同文件名列表

我已经达到了:

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

但我无法弄清楚如何将每个Name传递给[System.IO.Path] :: GetFileNameWithoutExtension

我该怎么做?

4 个答案:

答案 0 :(得分:6)

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

尝试以下

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

编辑更新

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

答案 1 :(得分:4)

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

答案 2 :(得分:2)

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

这里有更多适合你的人:[{3}}

答案 3 :(得分:2)

现在PowerShell v2是RTMd,您可以选择BaseName成员:

dir -recurse -filter * .mp3 |选择BaseName |排序