2011-12-26 15 views
10

パスに角括弧があると、PowerShellで異常な動作が発生します。たとえば、あなたがフォルダにある場合、:パスに括弧で囲まれた不思議な動作

C:\Some Movie [2011] 

mkvファイルが含まれていると次のように入力します。

ls *.mkv 

何も返されません! [2011]がワイルドカードとみなされているため失敗し

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

:私はこの問題は、PowerShellはのような何かをしようとしているという事実であると思います。私は、次のコマンドを使用して、このようなフォルダからすべてのmkvをretriveすることができました:

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に変更することはできません。 –

+0

はい、私は1つの 'mkv'ファイルしか持っていません。名前は分かりませんので、ワイルドカードが必要です。 – lalibi

答えて

7

あなたの質問に私のコメントを見てください(上記)。これは、そのフォルダにmkvファイルが1つだけあると予想される場合にはうまくいきます。 Rename-ItemはLiterlPath(v3で固定)をサポートしていないため、.NETに頼ることができます。また、Includeの代わりに-Filterを使用することをお勧めします(たった1つの拡張をフィルタリングする場合)。

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

+0

+1素晴らしい仕事、それは本当に滑らかです。 – Aaron

4

Rename-Itemコマンドレットthat doesn't handle filenames with bracketsには既知のバグがあります。リンクでは、「2010年1月29日にMicrosoftによって投稿されました」までスクロールダウンします。

Move-Itemコマンドに「-LiteralPath」オプションがあるため、代わりにMove-Itemコマンドレットを使用します。しかし、キャッチは、ディレクトリ名に大括弧が含まれていない場合にのみ動作することが明らかです。これは、あなたのケースを助けるようには聞こえません。

私はよく分かりませんが、DOS(cmd)と同様のものを試すことができます。それ以外の場合は、.Net言語からの名前変更を実行することに悩まされている可能性があります。

Microsoftが数日前にPowershell 3.0をリリースしたようです。約束はしていませんが、インストールしてバグを修正できたかどうか確認してください。

+0

新しいバージョンを指摘してくれてありがとう。 – lalibi

関連する問題