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

バッチファイルから 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ソリューション事業部

この記事へのコメント

この記事へのトラックバック