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