2009-11-25 8 views
5

私はビデオファイルをバッチ変換するために、PowerShellでスクリプトを作成しようとしています。Powershellのテストパスの動作

私が使用する方法は、ビデオファイルでいっぱいのフォルダに移動して実行することです。これは、 "コマンドラインモード"(ハンドブレークと呼ばれる)で実行できる変換プログラムを使用し、ファイル拡張子の前に "-android"が付加された変換ファイルを保存します。たとえば、フォルダ内にvideo1.aviという名前のファイルがある場合、スクリプトを実行した後のフォルダには2つのファイルがあります:video1.aviとvideo1-android.avi

このようにしたい理由は私は、各ビデオファイルのために変換されたバージョンがあるかどうかを確認できます(名前に-androidが付加されています)。その場合は、そのファイルの変換をスキップしてください。

これは私が食べるところです。問題は、Test-Pathの動作(ファイルが存在するかどうかをテストするために使用しているコマンドレット)です。

ビデオファイルに「珍しい」名前(たとえば私の場合はvideo [long] .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パラメータの使用をお勧めします。このパラメータは、ワイルドカードをサポートし、[]としてリテラルパス文字などを受け付けていません:

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

LiteralPathパラメータが別名を持っているので、テストパスの動作に直接には、Get-ChildItemコマンドレットの出力をパイプ理由がありますGet-ChildItemが出力するFileInfoオブジェクトのPSPathプロパティにマップされる「PSPath」。そのプロパティはLiteralPath(er PSPath)パラメータ "プロパティ名"にバインドされます。

+0

ありがとう、それは私が必要としていたもの – Rui

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

あなたは、$($ _。Name)と "%{}"がなぜそうであるかを詳しく説明できますか? – Rui

+1

'%'と 'Foreach'はForech-Objectコマンドレットのエイリアスです。文字列の中で '' $ _ "'のような簡単な変数展開を行うことはできますが、オブジェクトのプロパティにアクセスするなどの式を評価する場合は、部分式を使用する必要があります。 '' $($ _。Name) "'。 –

関連する問題