私はしばらくこれを掘り下げてきましたが、これがどのように機能するか理解できませんでした。私が必要なのは:
なぜこれが必要なのですか?何かを行うには単純なバッチファイルを実行する必要がありますが、PowerShellからのみ機能する高度な機能が必要なためです。具体的には、アプリケーションによってはSaveFileDialog
が必要です。
以下は、私が現在持っているもので、SaveFileDialog
の複雑な部分を取り除き、単純なバッチ+ powershell部分を残しました。
<# :
@echo off
setlocal
powershell -noprofile "iex (${%~f0} | out-string)"
goto :EOF
#>
Write-Host "Hello, I'm PowerShell!"
これらすべてをバッチファイルに入れると、たとえば、myfile.bat
となります。実行してPowerShellを呼び出し、そのメッセージを書き込みます。
私の質問/リクエスト:myfile.bat param1 param2 param3
を実行して、これらの引数/パラメーターをPowerShellスクリプトに渡すにはどうすればよいですか? powershellのwrite-Host
を介してパラメーターを出力するだけの最小限の例に本当に感謝します。
詳細はお気軽にお問い合わせください。ありがとうございました!
myfile.bat param1 param2 param3を実行して、これらの引数/パラメーターをPowerShellスクリプトに渡すにはどうすればよいですか?
バッチ引数 を後続のSET arg#=%~#
でスケールアップする必要があることは明らかです。
私はサンプルバッチスクリプトに引数を設定する変数を上に表示し、それらをPSスクリプトに渡して、後で最終結果と結び付けて、この回答の最後でさらに明確にするのに役立つと期待しています。
バッチスクリプトの例
@ECHO ON
SET arg1=%~1
SET arg2=%~2
SET arg3=%~3
SET arg4=%~4
SET PSScript=C:\Users\User\Desktop\Test.ps1
SET PowerShellDir=C:\Windows\System32\WindowsPowerShell\v1.0
CD /D "%PowerShellDir%"
Powershell -ExecutionPolicy Bypass -Command "& '%PSScript%' '%arg1%' '%arg2%' '%arg3%' '%arg4%'"
EXIT /B
PowerShell引数 を後続の$arg#=$args[#]
でスケールアップする必要があることは明らかです。
PowerShellスクリプトの例
$arg1=$args[0]
$arg2=$args[1]
$arg3=$args[2]
$arg4=$args[3]
Write-Host "$arg1 is a beauty!!"
Write-Host "$arg2 is cool!!"
Write-Host "$arg3 has body odor!!"
Write-Host "$arg4 is a beast!!"
バッチスクリプトに引数を渡します。
c:\users\user\desktop\test.cmd "Selena" "Justin" "Donald" "Bernie"
PowerShellスクリプトに引数を渡します。
Powershell -ExecutionPolicy Bypass -Command "& 'C:\Users\User\Desktop\Test.ps1' 'Selena' 'Justin' 'Donald' 'Bernie'
完全な結果は以下に反響します:
c:\users\user\desktop\test.cmd "Selena" "Justin" "Donald" "Bernie" SET arg1=Selena SET arg2=Justin SET arg3=Donald SET arg4=Bernie SET PSScript=C:\Users\User\Desktop\Test.ps1 SET PowerShellDir=C:\Windows\System32\WindowsPowerShell\v1.0 CD /D "C:\Windows\System32\WindowsPowerShell\v1.0" Powershell -ExecutionPolicy Bypass -Command "& 'C:\Users\User\Desktop\Test.ps1' 'Selena' 'Justin' 'Donald' 'Bernie'" Selena is a beauty!! Justin is cool!! Donald has body odor!! Bernie is a beast!!
バッチスクリプト内の%*はすべての引数(例:%1%2%3%4%5 ...%255)を参照します。番号で参照できるのは引数%1から%9までです。
この構文を使用してバッチスクリプトで引数をPSスクリプトに渡すことができたため、以下のような方法を使用できる場合があります。
動的PSスクリプト(:DynamicPSScriptBuild
ルーチン)を上に構築する必要があり、既に存在する場合は削除し、すべての実行の処理が完了すると削除します。
私は-file
ではなくPS -iex
を使用する必要がありましたが(PS1ファイルが存在する必要がある理由とその動的ビルド)、適切な引数をテストしたときに期待どおりに機能しました。各引数が1つのPSスクリプト実行反復である1つずつスクリプトを記述します。
PSスクリプトに渡されるすべての引数が次々に必要かどうかがわかりませんまたはすべてが一度に渡されるまたはPSスクリプトロジックがそれに渡される複数の引数を処理する方法同じ実行中ですが、おそらくこれにより、それに応じて調整するのに十分な詳細が得られます。
以下のスクリプトのFOR %%A IN ("Hello I'm PowerShell!", "Goodbye I'm Leaving", "Come with it and get some more"
の部分は、各文字列の値が二重引用符で囲まれ、実行の反復ごとにPSスクリプトに渡される引数として使用する各文字列を配置する部分ですカンマで区切られた。
(@ECHO OFF
を回して、pause
コマンドを使用して、繰り返しごとにすべてを表示して、すべてが期待どおりに機能していることを確認できるようにしたので)
<# :
@ECHO ON
SETLOCAL
:DynamicPSScriptBuild
SET PSScript=%~f0.ps1
IF EXIST "%PSScript%" DEL /Q /F "%PSScript%"
ECHO param($a) >>"%PSScript%"
ECHO Write-Host "$a" >>"%PSScript%"
:SetPSScriptArguments
FOR %%A IN ( "Hello I'm PowerShell!",
"Goodbye I'm Leaving",
"Come with it and get some more"
) DO CALL :Powershell "%%~A"
IF EXIST "%PSScript%" DEL /Q /F "%PSScript%"
GOTO :EOF
:PowerShell
PowerShell -NoProfile -ExecutionPolicy Bypass -file "%PSScript%" "%~1"
pause
GOTO :EOF
バッチ変数をバッチファイル内からPowershell行に直接渡します。これをテストするために、Write-Host
コマンドレットを引数として渡しました。
foo.bat
:
@echo off
set arg1=%1
powershell.exe %1 "this is from powershell"
pause
.bat
を引数付きで起動し、
.\foo.bat Write-Host
出力:
this is from powershell
Press any key to continue . . .