有没有办法使用Powershell Start-Process cmdlet启动新的Powershell会话并传递带有局部变量的scriptblock(其中一个将是一个数组)?
示例:
$Array = @(1,2,3,4)
$String = "This is string number"
$Scriptblock = {$Array | ForEach-Object {Write-Host $String $_}}
Start-Process Powershell -ArgumentList "$Scriptblock"
感谢。
答案 0 :(得分:2)
我很确定没有直接的方法将变量从一个PowerShell会话传递到另一个会话。您可以做的最好的是一些解决方法,比如在 -ArgumentList 中传递的代码中声明变量,在调用会话中插值。如何将变量插入 -ArgumentList 中的声明取决于变量的类型。对于数组和字符串,您可以执行以下操作:
$command = '<contents of your scriptblock without the curly braces>'
Start-Process powershell -ArgumentList ("`$Array = echo $Array; `$String = '$String';" + $command)
答案 1 :(得分:2)
您可以将脚本块的内容包装在函数中,然后从ArgumentList调用该函数并将变量作为参数传递给函数as I do on this post。
$ScriptBlock = {
function Test([string]$someParameter)
{
# Use $someParameter to do something...
}
}
# Run the script block and pass in parameters.
$myString = "Hello"
Start-Process -FilePath PowerShell -ArgumentList "-Command & {$ScriptBlock Test('$myString')}"
答案 2 :(得分:1)
我能够通过使用“/”连接数组来创建字符串并将scriptblock输入到具有适当参数的另一个.ps1脚本并将连接的字符串拆分回第二个脚本中的数组并使用
Start-Process Powershell -ArgumentList "&C:\script.ps1 $JoinedArray $String"
丑陋,但这是我能让它发挥作用的唯一方法。感谢所有的回复。
答案 3 :(得分:0)
如果你想传递可序列化但不是字符串的对象,我写了一个解决方案:Is there a way to pass serializable objects to a PowerShell script with start-process?
答案 4 :(得分:0)
command line options for PowerShell.exe表示你应该能够通过添加-args来使用脚本块时传递参数:
PowerShell.exe -Command { - | <script-block> [-args <arg-array>] | <string> [<CommandParameters>] }
然而,当我尝试这样做时,我收到以下错误:
-args:术语“-args”未被识别为cmdlet,函数,脚本文件或可操作程序的名称。检查拼写 名称,或者如果包含路径,请验证路径是否正确 再试一次。
我在脚本块中添加$MyInvocation | fl
以查看发生了什么,看起来-args只是附加到脚本块中的反序列化命令(因此错误,因为-args不是有效的命令)。我也尝试使用GetNewClosure() and $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]
或$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"