QA@IT

コマンドプロンプトのバッチファイル(.bat)からPowerShell起動時のパラメータの渡し方について

19472 PV

PowerShell2.0で記述した.ps1ファイルをコマンドプロンプトから.batを使用して起動しようとしています。
.ps1の内容は必須パラメータ3個を受け取って標準出力するだけのものです。

# test.ps1
param(
    [parameter(mandatory=$true)]
    [string]$str1,

    [parameter(mandatory=$true)]
    [string]$str2,

    [paraneter(mandatory=$true)]
    [string]$str3
)

$str1
$str2
$str3

同一フォルダに下記のバッチファイルを"test.bat"として配置しました。
標準出力の内容をlog.txtにリダイレクトしています。

powershell ".\test.ps1 aaa bbb ccc" > log.txt

疑問1
この状態でtest.batを起動するとプロンプトは下記のようになります。

C:\work>test.bat

C:\work>powershell ".\test.ps1 aaa bbb ccc"  1>log.txt

今のところ動作に実害はないのですが,バッチファイルに書いた内容がそのまま実行されず,
ファイルへのリダイレクト付近に"1"が付加された上にスペースが勝手に詰められたところもあります。
どうしてこのような改変がされるのでしょうか。

疑問2
コマンドプロンプトの特殊文字の一つに環境変数などで使用される"%"があります。
コマンドプロンプトでは%^%とエスケープするらしいので,test.bat中のaaa^%に変更して
$str1に%を渡そうとしたところ,実行の様子は下記のようになりました。

C:\work>test.bat

C:\work>powershell ".\test.ps1 ^ bbb ccc"  1>log.txt

上記の疑問1の現象に加え,エスケープも失敗してしまいました。
意図通り実行させるにはどのようにtest.batを修正するべきでしょうか。

以上,なにとぞご教示ください。

回答

疑問1

コマンドプロンプトが実際に実行するコマンドが表示されているためです。

下記のどちらもコマンドプロンプト的には同じです。

powershell ".\test.ps1 aaa bbb ccc" > log.txt
powershell ".\test.ps1 aaa bbb ccc"  1>log.txt

>1> の数字の部分を省略したものです。また、> の前後の空白には構文上の意味はありません。

疑問2

PowerShell のことはよくわかりませんが、バッチファイルの中で % はメタ文字なので %% のように置き換える必要があります。

また、コマンドプロンプトで " の中の "%" はエスケープする必要はありません。

なので次のようにすると良いと思います。

powershell ".\test.ps1 %% bbb ccc" > log.txt
編集 履歴 (0)
ウォッチ

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