本記事ではPowerShell
でワイルドカードパターンを含む文字列をエスケープする処理方法について説明します。
前半部分はどのような問題があるかを説明しているため、文字列をエスケープ処理方法としては、WildcardPatternクラスのEscapeメソッドを利用してエスケープする
の項からが本題となります。
そもそもワイルドカードパターンを含む文字列でエスケープ処理が必要な場合
PowerShell
でスクリプトを書いているたとたまにファイル名にワイルドカードパターンを含んでいてファイルを処理しようとして想定しない処理となってしまう事があります。
ありがちなのは[]
を含むファイル名を操作しようとする場合があります。
例としては、[foobar]helloworld.txt
というファイルが存在したとして、このファイルを操作しようとして。
Get-Item [foobar]helloworld.txt
と実行しても何も取得できません。
これはファイル名に[]
がつかわれておりワイルドカードパターンを含む文字列となってしまっているためです。
このためファイル操作しようとしていますが、ワイルドカードで解釈されて想定通り動作しません。
対応としては[]
をエスケープ処理してあげる必要があります。
下記はバッククオートでエスケープした場合の画像。
上記の例では、Get-Item
でしたが、Copy-Item
だったりRemove-Item
でも同様です。
上記コマンドレットはオプション指定をされていない場合は、Path
オプションに引き渡されますが、このPath
がワイルドカードパターンが含まれていた場合、このような動作になってしまっています。
LiteralPathオプションを利用して回避することもできる
このような場合どうするかといえば、文字列をエスケープ処理してあげる以外にも、標準のコマンドレットではLiteralPath
というオプションがだいたい用意されているのでこちらを使えば問題はありません。
Get-Item -LiteralPath [foobar]helloworld.txt
ワイルドカードが含まれてい、それを考慮できておらず失敗するケースはPowerShell
あるあるかと思います。
WildcardPatternクラスのEscapeメソッドを利用してエスケープする
標準以外のコマンドレットだったり、自作のコマンドレットでLiteralPath
がなくて困る場合はあるので、PowerShell
でワイルドカードパターンが含まれている文字列のエスケープ方法について。
上記WildcardPattern
クラスのEscape
メソッドを利用すると、特殊な文字をエスケープした文字に変換してくれます。
[System.Management.Automation.WildcardPattern]::Escape(".\[foobar]helloworld.txt")
画像の用に、バッククオートで特殊文字をエスケープしてくれます。これを利用することによって特殊文字を含んでいてもPathオプションで処理できるようになります。
下記はエスケープしない文字列とエスケープした文字列をパイプでGet-Item
コマンドレットに渡したパターン。
総評
ファイルコピーしたり、ログ削除したりといった処理を書いているときに、このような処理を知らないと想定外の動作をしてしまう場合があります。
これはPowerShell
あるあるな気がしますが、LiteralPath
だったりエスケープ方法を理解しておくことで問題ないスクリプトを作成しましょう。