2011-12-26 79 views
10

當路徑中有方括號時,PowerShell有一種奇怪的行爲。舉例來說,如果你的文件夾中:路徑中包含方括號的奇怪行爲

C:\Some Movie [2011] 

其中包含一個mkv文件,並鍵入:返回

ls *.mkv 

什麼!我認爲問題在於PowerShell將嘗試做一些喜歡這樣的事實:

Get-ChildItem 'C:\Some Movie [2011]\*.mkv' 

因爲[2011]被認爲是一個通配符其失敗。我能夠從這樣的文件夾下面的命令retrive所有mkv

Get-ChildItem -LiteralPath 'C:\Some Movie [2011]' -Include *.mkv 

但是當我嘗試在重命名-Item命令養活這些結果失敗。

Get-ChildItem -LiteralPath 'C:\Some Movie [2011]' -Include *.mkv | Rename-Item -NewName "movie.mkv" 

在沒有括號的文件夾中執行相同的操作沒有問題。有任何想法嗎?

+0

如果該文件夾包含多個mkv文件該怎麼辦?您不能將它們全部重命名爲movie.mkv。 – 2011-12-26 14:50:27

+0

是的,我只有一個'mkv'文件,我只是不知道它的名字,所以我需要一個通配符。 – lalibi 2011-12-26 15:35:45

回答

7

看到我對你的問題的評論(上圖)。這將工作,如果你期望的情況下,該文件夾中只有一個mkv文件。 Rename-Item不支持LiterlPath(在v3中修復),您可以使用.NET。我也建議(當你過濾一個擴展名時)使用-Filter而不是Include,它的執行速度更快。

Get-ChildItem -LiteralPath 'D:\Some Movie [2011]' -Filter *.mkv | Foreach-Object{ 
    $NewName = Join-Path -Path $_.DirectoryName -ChildPath 'movie.mkv' 
    [System.IO.File]::Move($_.FullName,$NewName) 
} 
+0

這工作很好。謝謝。 – lalibi 2011-12-26 15:32:38

+0

+1不錯的作品,這真的很漂亮。 – Aaron 2011-12-26 15:37:12

4

Rename-Item cmdlet that doesn't handle filenames with brackets中存在已知的錯誤。在鏈接中,向下滾動到「由Microsoft發佈於2010年1月29日」。

解決方法是使用Move-Item cmdlet,因爲Move-Item具有「-LiteralPath」選項。但是,我們可以發現,它只有在目錄名不包含括號的情況下才起作用,聽起來不會對你的情況有所幫助。

我不確定,但是你可以嘗試類似於DOS(cmd)的東西。否則,您可能會停留在.Net語言中執行重命名,因爲您可以確保它在那裏工作。

它看起來像微軟剛剛在幾天前發佈Powershell 3.0。沒有承諾,但你可以嘗試安裝它,看看他們是否設法修復了這個bug。

+0

感謝您指出新版本。 – lalibi 2011-12-26 15:33:22