バッチとPowershellスクリプトで値をやりとりする方法

ALL
スポンサーリンク

バッチファイルから Powershellスクリプトを呼び出した際に、変数などの値をバッチとPowershell相互でやりとりする方法についてです。

スポンサーリンク

コマンドラインから Powershellスクリプトへ値を渡す

コマンドラインから Powershellスクリプトを呼び出す際に、Powershellスクリプトへ値を渡す方法です。

引数で渡す

Powershellスクリプトでは、コマンドラインで指定された引数は $args[0] , $args[1] , … で取得できます。

バッチファイル(test.bat)

powershell -executionpolicy bypass -File test.ps1 value1 value2

Powershellスクリプト(test.ps1)

Write-Host $args[0]
Write-Host $args[1]

環境変数経由で渡す

Powershellスクリプトでは、環境変数を $env:環境変数名 で取得できます。

バッチファイル(test.bat)

SET VALUE=12345
powershell -executionpolicy bypass -File test.ps1

Powershellスクリプト(test.ps1)

Write-Host $env:VALUE
スポンサーリンク

Powershellスクリプトからコマンドラインへ値を渡す

コマンドラインから呼び出された Powershellスクリプトが、終了時にコマンドラインへ値を渡す方法です。

単一の数値を渡す場合

この方法で渡せるのは、0~65535の範囲の数値のみです。
また、文字列は渡せません。
Powershellスクリプトで exit で指定した数値が、コマンドラインで %ERRORLEVEL% で取得できます。

Powershellスクリプト(test.ps1)

exit 123

バッチファイル(test.bat)

powershell -executionpolicy bypass -File test.ps1
echo %ERRORLEVEL%

単一の値を渡す場合

この方法では、文字列でも渡せます。
下記例のようにすると、Powershellスクリプトで return で指定した値が、コマンドラインで %VALUE% で取得できます。
VALUE は他の変数名でもOKです。

Powershellスクリプト(test.ps1)

return 'Hello!'

バッチファイル(test.bat)

FOR /F "usebackq" %%i IN (`powershell -executionpolicy bypass -File test.ps1`) DO SET VALUE=%%i
echo 値は %VALUE%

なお、%%i の個所は、 batファイル内では %%i と記述しますが、コマンドラインで直接たたく場合は %i と記述します。

複数値をスペース区切りで渡す場合

この方法では、文字列でも渡せます。
下記例では3つの値を返していますが、4つ以上の場合は、バッチファイルでは %%d , %%e , …のようにすると取得できます。

Powershellスクリプト(test.ps1)

$ret="ret1 ret2 ret3"
return $ret

バッチファイル(test.bat)

@echo off
FOR /F "usebackq tokens=1-10 delims= " %%a IN (`powershell -executionpolicy bypass -File test.ps1`) DO (
SET VALUE1=%%a
SET VALUE2=%%b
SET VALUE3=%%c
)
echo %VALUE1% , %VALUE2% , %VALUE3%

複数値をタブ区切りで渡す場合

この方法では、スペースの入った文字列でも渡せます。
下記例の [タブ]の個所は、タブコード(TABキーで入力)を入れて下さい。
また、下記例では3つの値を返していますが、4つ以上の場合は、バッチファイルでは %%d , %%e , …のようにすると取得できます。

Powershellスクリプト(test.ps1)

$ret="ret 1[タブ]ret 2[タブ]ret 3"
return $ret

バッチファイル(test.bat)

@echo off
FOR /F "usebackq tokens=1-10 delims=[タブ]" %%a IN (`powershell -executionpolicy bypass -File test.ps1`) DO (
SET VALUE1=%%a
SET VALUE2=%%b
SET VALUE3=%%c
)
echo %VALUE1% , %VALUE2% , %VALUE3%

参考

PowerShellで環境変数を設定する – bakemoji |> log
PowerShell/環境変数の値を取得する方法 – Windowsと暮らす
PowerShellの出力内容をバッチで受け取る – tech.guitarrapc.cóm
.bat(バッチファイル)のforコマンド解説。 – Qiita
意外と知られていないけど、知っていると便利な FOR コマンド – Web/DB プログラミング徹底解説
PowerShellスクリプトに引数を渡す | 株式会社CONFRAGE ITソリューション事業部

コメント