2010-11-04 79 views
1

我試圖編寫一個小腳本來爲幾十個mp3/mp4文件的文件夾/子文件夾自動創建播放列表(m3u),同時省略其中的各種其他misc文件。我對Powershell知之甚少,但設法拼湊了一些幾乎可行的東西。唯一的一點是,當我使用「$ _。extension -eq」時,它似乎不起作用,或者至少我沒有正確使用它。例如,如果我使用它來匹配臨時文件夾中的日誌/ txt文件,它將起作用,但在這種情況下不起作用。下面是代碼 -

$pathname = read-host "Enter path" 
$root = Get-ChildItem $pathname | ? {$_.PSIsContainer} 
$rootpath = $pathname.substring(0,2) 
Set-Location $rootpath 
Set-Location $pathname 
foreach($folder in $root) { 
Set-Location $folder 
foreach($file in $folder) { 
$txtfile =".m3u" 
$files = gci | Where-Object {$_.extension -eq ".mp3" -or ".mp4"} 
$count = $files.count 
if($count -ge 2){ 
$txtfile = "_" + $folder.name + $txtfile 
Add-Content $txtFile $files 
} 
} 
if(test-path $txtFile){ 
Add-Content $txtFile `r 
} 
Set-Location $pathname 
} 

我試圖像換了「當量」,但沒有運氣「-match」幾個變化。順便說一句,如果我從括號中省略「 - 或」.mp4「」,那麼它工作正常,但我需要它匹配兩者,並且只有mp3/mp4。

在此先感謝。

回答

8

只要你抱怨擴展,讓我們開始吧。據推測,代碼中存在一個錯誤;這個表達式/語法在技術上是有效的:

$_.extension -eq ".mp3" -or ".mp4" 

但顯然意圖是:

$_.extension -eq ".mp3" -or $_.extension -eq ".mp4" 

首先試用時的補償。

+0

非常感謝你。現在完美的工作! – gavin19 2010-11-04 19:47:01

3

我要添加爲快捷方式選項:

gci | Where-Object {".mp3",".mp4" -eq $_.extension} 
+1

我認爲運算符'-contains'會更好一些:它不會讓布爾變得令人困惑(在例子中'-eq'不是這種情況),並且它應該更有效(它會停在第一個找到的項目上)。但是這個想法本身很好,擴展可以被定義爲數組'$ extensions',那麼我們可以做這個簡單的布爾檢查:'$ extensions -contains $ _。extension'。 – 2010-11-08 16:57:13

+0

-eq也支持數組,所以我可以想到沒有區別。 – JasonMArcher 2010-11-08 17:15:02

+1

差異很微妙,但存在。 1)'-eq'在你的例子中返回一個字符串,如果它存在的話;一般情況下它會返回匹配項的數組。它根本不是布爾型的。 2)按照定義'-eq'必須掃描*所有*項目,即使已經找到了。總而言之:'-eq'看起來比'-contains'更重要。 – 2010-11-08 17:35:23