PowerShell.exe的命令行选项表明您应该能够在使用脚本块时通过添加 -args 来传递参数:
PowerShell.exe -Command { - | <script-block> [-args <arg-array>] | <string> [<CommandParameters>] }
但是,当我尝试这样做时,出现以下错误:
-args :术语“-args”未被识别为 cmdlet、函数、脚本文件或可运行程序的名称。检查名称的拼写,或者如果包含路径,请验证路径是否正确并重试。
我添加$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"