PowerShell使用Runspace多线程时动态变量无法生效该如何解决?
问题原因
新建的Runspace是独立的执行会话,和主PowerShell会话的变量作用域完全隔离,主会话的全局变量不会自动同步到新Runspace中,因此脚本块内无法直接读取到主会话定义的$Global:NewMultiThreadContentAddScript变量。
推荐解决方案
你已经初始化了同步哈希表$syncHash,直接用它传递参数是改动最小的方案,同步哈希表本身就是为跨Runspace共享数据设计的:
function Multithread_func { param ( $NewMultiThreadContent ) $syncHash = [hashtable]::Synchronized(@{}) # 将需要传递的内容存入同步哈希表 $syncHash.Message = $NewMultiThreadContent $newRunspace = [runspacefactory]::CreateRunspace() $newRunspace.ApartmentState = "STA" $newRunspace.ThreadOptions = "ReuseThread" $newRunspace.Open() # 把同步哈希表注入新Runspace的会话 $newRunspace.SessionStateProxy.SetVariable("syncHash",$syncHash) $psCmd = [PowerShell]::Create().AddScript({ # 新Runspace默认未加载窗体程序集,先手动加载避免类型找不到报错 Add-Type -AssemblyName System.Windows.Forms | Out-Null # 从同步哈希表读取消息内容 [System.Windows.Forms.MessageBox]::Show($syncHash.Message,"toto",'OK','information') }) $psCmd.Runspace = $newRunspace $data = $psCmd.BeginInvoke() } Multithread_func -NewMultiThreadContent "ceci est une fenêtre test"
可选替代方案:直接给脚本块传参
如果不需要共享其他数据,也可以通过AddArgument方法直接给脚本块传递参数,不需要依赖同步哈希表:
$psCmd = [PowerShell]::Create().AddScript({ param($InputMessage) Add-Type -AssemblyName System.Windows.Forms | Out-Null [System.Windows.Forms.MessageBox]::Show($InputMessage,"toto",'OK','information') # 直接把变量作为参数传给脚本块 }).AddArgument($NewMultiThreadContent)
内容的提问来源于stack exchange,提问作者The Nurse
相关产品推荐
相关产品推荐

