QA@IT

PowerShell Test-Pathコマンドのパス指定について

296 PV

最近PowerShellに興味を持ち触っているものです。
OSはWindows7です。

Test-Pathコマンドのチェックでif分岐させようとしているのですが、
チェックするファイル名が次のようになっています。

[作者名]テスト.zip

これをC:\work\直下へ設置し、PowerShellから

PS C:\ work> Test-Path 'C:\work`[作者名`]テスト.zip'

とコマンドを実行した場合はTrueと帰ってくるのですが、
これをps1ファイルにて下記のような形でTest-Pathすると
Falseの方へ分岐してしまいます。

直前のWrite-Hostにて変数に格納されている内容を
確認するとPowerShellへ直打ちしたものと差異はなく
それを直接コピーして実行した場合はTrueが帰ってきます。

どのように指定すればps1ファイルからでもTrueで帰ってくるのでしょうか。


$TestPath = "C:\work\[作者名]test.zip"
$TestPath = $TestPath -creplace "\[", "``[" -creplace "\]", "``]"
$TestPath = "'" + $TestPath + "'"

Write-Host $TestPath
if(Test-Path $TestPath) {
        Write-Host OK
   }else{
        Write-Host X
   }

以上、お分かりになる方お力添えをお願いします。

回答

その文字列($TestPath)の作り方では、最終的にはシングルクォート ' がファイル名の一部として含まれてしまいます。
(より細かく言えば'Cドライブのworkディレクトリの [作者名]test.zip'ファイルを探しているということです。)

なので3行目 $TestPath = "'" + $TestPath + "'" を削除すればうまくいくでしょう。
コマンドラインからの実行、BATファイル、(Linuxの)shellスクリプトなどではファイル名が空だったりスペースを含む場合を想定して引用符を括ることはありますが、powershellスクリプトの変数では関数実行前に展開されるというよりは変数そのものを関数(Test-Pathなど)に渡すようなので大丈夫でした。
(逆にPowershellでは変数に設定するときに明示的に引用符で括らないと文字列とみなされません)

ところで今気がつきましたが、ファイル名がコマンド実行だと〜テスト.zipなのにスクリプトの方だと〜test.zipと英字になってますね。

なお、ファイルパス関連の関数で -LiteralPath パラメータを渡せる場合、角かっこのエスケープはしなくても大丈夫です。以下はそれを使用した例

C:\work> Test-Path -LiteralPath 'C:\work\[作者名]テスト.zip'
$TestPath = "C:\work\[作者名]テスト.zip"

Write-Host $TestPath
if(Test-Path -LiteralPath $TestPath) {
   Write-Host OK
}else{
   Write-Host X
}
編集 履歴 (0)
  • 仰るとおり3行目を削除することでうまくTrue分岐へ進んでくれました!

    ファイル名に!や半角スペースなどがあった場合のことを考えてシングルコートで括っていたのがダメだったのですね。。。

    -LiteralPathオプションも勉強になりました!
    ご回答いただきありがとうございました。

    またファイル名は質問用に書き換えた時の誤記ですね。混乱させてしまい申し訳ないです。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。