想要使用带有动态变量的多线程 Powershell 创建函数

Want create function using multithread Powershell with dynamical variables

我尝试使用多线程(在运行空间内)和变量内的消息来执行一个函数,但是当我 运行 脚本时,我变量内的值没有显示在屏幕结果上,但是当我添加静态时消息,它完美地工作,这是我的代码:

function Multithread_func {
   param (
$NewMultiThreadContent
    )
    $Global:NewMultiThreadContentAddScript = $NewMultiThreadContent
    "$Global:NewMultiThreadContentAddScript"

$syncHash = [hashtable]::Synchronized(@{})
$newRunspace =[runspacefactory]::CreateRunspace()
$newRunspace.ApartmentState = "STA"
$newRunspace.ThreadOptions = "ReuseThread"         
$newRunspace.Open()
$newRunspace.SessionStateProxy.SetVariable("syncHash",$syncHash)          
$psCmd = [PowerShell]::Create().AddScript({
[System.Windows.Forms.MessageBox]::Show("$Global:NewMultiThreadContentAddScript","toto",'OK','information')
})

$psCmd.Runspace = $newRunspace
$data = $psCmd.BeginInvoke()
#[System.Windows.Forms.MessageBox]::Show("$Global:NewMultiThreadContentAddScript","toto",'OK','information')

}


Multithread_func -NewMultiThreadContent "ceci est une fenêtre test"

我想我找到了 .AddScript({}) 的问题,“{}”应该是问题所在,因为 $Global:NewMultiThreadContentAddScript 似乎在 AddScript 中消失了,

我也尝试过不使用“{}”,但没有多线程,这不是我想要的...

有人有想法吗?

有几种方法可以将数据传递到新的 powershell 会话

第一个,已经在评论中提到,是使用 $newRunspace.SessionStateProxy.SetVariable()

$syncHash = [hashtable]::Synchronized(@{})
$syncHash.Add('myContent', $NewMultiThreadContent)
$newRunspace.SessionStateProxy.SetVariable('syncHash', $syncHash)          
$psCmd = [PowerShell]::Create().AddScript( {
        [System.Windows.Forms.MessageBox]::Show($syncHash.myContent, 'toto', 'OK', 'information') 
    })

如果我们只需要传入变量,就没有必要使用syncronized hashtable。我们可以使用 SetVariable() 传递几乎任何东西。

$newRunspace.SessionStateProxy.SetVariable('newVariableName', $NewMultiThreadContent)          
$newRunspace.SessionStateProxy.SetVariable('someOtherNewVariable', @('value1', 'value2'))          
$psCmd = [PowerShell]::Create().AddScript( {
        [System.Windows.Forms.MessageBox]::Show(($someOtherNewVariable[0] + ': ' + $newVariableName), 'toto', 'OK', 'information') 
    })

同步哈希表对于以线程安全的方式在多个线程之间共享数据很有用,例如从控制台线程访问长运行脚本的结果,或将多个运行空间的数据收集到一个集合中


将变量传递到脚本块的第二种方法是将 param() 块添加到脚本并在 PowerShell 对象上使用 AddArgument() 方法。

$psCmd = [PowerShell]::Create().AddScript( {
        param($MyContent) 
        [System.Windows.Forms.MessageBox]::Show($MyContent, 'toto', 'OK', 'information')
    
    }).AddArgument($NewMultiThreadContent)

$NewMultiThreadContent 将作为参数传递给您的脚本块,该参数将放在第一个位置:$MyContent.