在下面的代码块中,我试图在 3 个单独的线程中运行 Get-MyCmdlet,如果 Get-MyCmdlet 没有提供任何内容,每个线程都会打开一个谷歌页面。
Get-MyCmdlet 相当简单,它唯一做的就是 WriteObject("hello world"); (在 c# 代码中定义)。
但是脚本总是打开一个谷歌页面,除非我将 Get-MyCmdlet 更改为 Get-Host(这是系统默认的 cmdlet)。
是因为自定义 cmdlet 不支持多线程吗?任何帮助将不胜感激!
cmdlet:
[Cmdlet(VerbsCommon.Get, "MyCmdlet ")]
public class GetMyCmdlet : Cmdlet
{
protected override void ProcessRecord()
{
WriteObject("hello world");
}
}
剧本:
$ScriptBlock = {
$result = Get-MyCmdlet
if (!$result) {[System.Diagnostics.Process]::Start("http://www.google.com")}
$name = ($result | get-member)[-1].name
$result = $result.$name
return $result
}
……
$threads = 3
for ($i = 0; $i -lt $threads) {
$running = @($jobs | Where-Object {$_.State -match 'Running'})
Write-Host $running.length
if ($running.length -lt $threads) {
$jobs += Start-job -ScriptBlock $ScriptBlock
$i = $i + 1
} else {
get-job | receive-job
$finished = @($jobs | Where-Object ($_.State -match 'Completed'))
if ($finished) {
$finished.getType()
foreach($job in $finished) {
Receive-Job -keep $job | Out-File "Output$.txt"
$i = $i + 1
$finished.Remove($job)
Remove-Job -job $job
}
}
}
}