2009-08-05 104 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 |排序

相關問題