我有一個目錄充滿文件對。每對文件與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
太棒了,謝謝 –