web-dev-qa-db-ja.com

パラメーターを使用したバッチ内でのPowerShellの実行について

私はしばらくこれを掘り下げてきましたが、これがどのように機能するか理解できませんでした。私が必要なのは:

  1. バッチファイルを実行できる
  2. バッチファイルにはパラメータが必要です
  3. パラメータは、バッチファイルから同じファイル内のPowerShellスクリプトに渡す必要があります

なぜこれが必要なのですか?何かを行うには単純なバッチファイルを実行する必要がありますが、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スクリプトを作成する

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!!
    

    enter image description here


その他のリソース

3
Pimp Juice IT

バッチスクリプトを介してPowerShellスクリプトに複数の引数を渡す

この構文を使用してバッチスクリプトで引数を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

その他のリソース

2
Pimp Juice IT

バッチ変数をバッチファイル内から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 . . .
0
root