2009-11-25 153 views
5

我想在powershell中編寫腳本來批量轉換視頻文件。Powershell中的測試路徑行爲

我打算使用它的方式是去一些文件夾充滿視頻文件並運行它。它使用可以在「命令行模式」(命名爲手剎)中運行的轉換程序,並在文件擴展名之前將轉換後的文件與「-android」附加在一起。例如,如果我在文件夾中有一個名爲video1.avi的文件,在運行腳本之後,該文件夾有2個文件:video1.avi和video1-android.avi

我想這樣做的原因是這樣的我可以檢查每個視頻文件是否存在轉換後的版本(將名稱附加-android)。如果是這樣,跳過該文件的轉換。

而這正是我要加倍努力的地方。問題是Test-Path的行爲(我用來測試文件是否存在的cmdlet)。

會發生什麼情況是,如果視頻文件有一個「不尋常的」名稱(例如在我的情況下,它的視頻[長] .avi)如果您嘗試檢查該文件是否存在,Test-Path將始終返回False。

爲您測試這樣的一個簡單的方法是,例如該做的事:

轉到一個空文件夾, 運行記事本創建一個文件「[」在它的名字:

&notepad test[x].txt 

保存文件

然後做到這一點:

Get-ChildItem | ForEach-Object {Test-Path $_.FullName} 

它確實不是真的!它應該是對的?那麼它不會如果該文件的名稱中有[[「(我沒有檢查任何其他特殊字符)

我意識到,如果你逃脫」[「和」]「它的作品

Test-Path 'test`[x`].txt' 

返回true。

我該如何解決這個問題?我希望能夠:給定文件的BaseName,將其附加到「-android.avi」並檢查是否存在具有該名稱的文件。

感謝, 瑞

回答

8

許多PowerShell命令具有支持通配符路徑參數。如您所見,在PowerShell中,不僅*是通配符,而且[]也被視爲通配符。您可以在幫助主題about_Wildcards中閱讀更多信息。

對於你的問題,如果你不需要通配符,那麼我會建議使用-LiteralPath參數。該參數不支持通配符和接受[]爲文字路徑中的字符,例如:

Get-ChildItem | ForEach {Test-Path -LiteralPath ` 
         "$([io.path]::ChangeExtension($_.FullName,'avi'))"} 

僅供參考,管道獲取-ChildItem的輸出直接進入測試的路徑的原因的工作原理是因爲LiteralPath參數有一個別名「PSPath」映射到由Get-ChildItem輸出的FileInfo對象上的PSPath屬性。該屬性通過「屬性名稱」綁定到LiteralPath(呃PSPath)參數。

+0

謝謝,那正是我所需要的 – Rui 2009-11-25 23:12:29

1
dir | % {test-path "$($_.Name)-android.avi"} 
+1

你能詳細說一下,爲什麼$($ _。Name)和「%{}」? – Rui 2009-11-25 23:16:12

+1

'%'和'Foreach'是Forech-Object cmdlet的別名。在一個字符串內部,你可以像''$ _「'那樣進行簡單的變量擴展,但是如果你想計算一個表達式,比如訪問一個對象的屬性,你需要使用一個子表達式,例如' 「$($ _。名稱)」'。 – 2009-11-26 01:20:50