PowerShell.exeのコマンド ライン オプションには、スクリプト ブロックを使用するときに -args を追加することで引数を渡すことができるはずであることが示されています。
PowerShell.exe -Command { - | <script-block> [-args <arg-array>] | <string> [<CommandParameters>] }
ただし、それを実行しようとすると、次のエラーが発生します。
-args : 「-args」という用語は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。名前のスペルを確認するか、パスが含まれている場合は、パスが正しいことを確認してから再試行してください。
何が起こっているかを確認するためにスクリプト ブロックに追加$MyInvocation | fl
しましたが、スクリプト ブロック内の逆シリアル化されたコマンドに -args が追加されているように見えます (したがって、-args は有効なコマンドではないため、エラーが発生します)。GetNewClosure() と $Using:VariableNameも使用してみましたが、これらはスクリプト ブロックが呼び出されたときにのみ機能するように見えます (これとは対照的に、コマンドをシリアル化/逆シリアル化するために使用しています)。
Deadlydog's answer のような関数でラップすることで、機能させることができました。
$var = "this is a test"
$scriptblock = {
$MyInvocation | fl #Show deserialized commands
function AdminTasks($message){
write-host "hello world: $message"
}
}
Start-Process powershell -ArgumentList '-noexit','-nologo','-noprofile','-NonInteractive','-Command',$scriptblock,"AdminTasks('$var')" -Verb runAs #-WindowStyle Hidden
#Output:
MyCommand :
$MyInvocation | fl #Show deserialized commands
function AdminTasks($message){
write-host hello world: $message
}
AdminTasks('this is a test')
BoundParameters : {}
UnboundArguments : {}
ScriptLineNumber : 0
OffsetInLine : 0
HistoryId : 1
ScriptName :
Line :
PositionMessage :
PSScriptRoot :
PSCommandPath :
InvocationName :
PipelineLength : 2
PipelinePosition : 1
ExpectingInput : False
CommandOrigin : Runspace
DisplayScriptPosition :
hello world: this is a test
スクリプト ブロックでラップして$args[0]
orを使用$args[1]
することもできますが、デシリアライズ時に問題が発生した場合は $var0 または $var1 を引用符で囲み、`$ を使用して $sb が置き換えられないようにする必要があることに注意してください。 "" その変数は呼び出し元のスコープに存在しないため:
$var0 = "hello"
$var1 = "world"
$scriptblock = {
$MyInvocation | fl #Show deserialized commands
$sb = {
write-host $args[0] $args[1]
}
}
Start-Process powershell -ArgumentList '-noexit','-nologo','-noprofile','-NonInteractive','-Command',$scriptblock,"& `$sb $var0 $var1"