Я пытаюсь заставить Джобса работать и снова решаю проблему с ними. РЕДАКТИРОВАТЬ: понял, что мне нужно изменить каждую переменную внутри Job ScriptBlocks, чтобы включить "using", поэтому $using:temp_cpu, $using:temp_cpu_cores, $using:temp_cpu_logical

Даже с исправлением using выходные данные, приведенные ниже, по-прежнему случайным образом приводят к пустым выводам, хотя я ожидаю, что выходные файлы будут а) существовать и б) иметь ненулевой размер, но примерно 1 из 3 прогонов ниже приведен пустой вывод.

function test {
    $temp_cpu = "$($env:TEMP)\ps_temp_cpu.txt"
    $temp_cpu_cores = "$($env:TEMP)\ps_temp_cpu_cores.txt"
    $temp_cpu_logical = "$($env:TEMP)\ps_temp_cpu_logical.txt"
    rm -force $temp_cpu -EA silent ; rm -force $temp_cpu_cores -EA silent ; rm -force $temp_cpu_logical -EA silent
    $job_cpu         = Start-Job -ScriptBlock { (Get-WmiObject -Class Win32_Processor).Name > $using:temp_cpu }
    $job_cpu_cores   = Start-Job -ScriptBlock { (Get-WmiObject -Class Win32_Processor).NumberOfCores > $using:temp_cpu_cores }
    $job_cpu_logical = Start-Job -ScriptBlock { (Get-WmiObject -Class Win32_Processor).NumberOfLogicalProcessors > $using:temp_cpu_logical }
    Wait-Job $job_cpu, $job_cpu_cores, $job_cpu_logical
    while (!(Test-Path $temp_cpu)) { while ((Get-Item $temp_cpu -EA silent).length -eq 0kb) { Start-Sleep -Milliseconds 500 } }
    while (!(Test-Path $temp_cpu_cores)) { while ((Get-Item $temp_cpu_cores -EA silent).length -eq 0kb) { Start-Sleep -Milliseconds 500 } }
    while (!(Test-Path $temp_cpu_logical)) { while ((Get-Item $temp_cpu_logical -EA silent).length -eq 0kb) { Start-Sleep -Milliseconds 500 } }

    "CPU:               $(cat $temp_cpu)"
    "CPU Cores:         $(cat $temp_cpu_cores)"
    "CPU Logical:       $(cat $temp_cpu_logical)"
    rm -force $temp_cpu -EA silent ; rm -force $temp_cpu_cores -EA silent ; rm -force $temp_cpu_logical -EA silent
}
0
YorSubs 17 Фев 2020 в 10:39

2 ответа

Лучший ответ

Попробуй это:

$job_cpu = Start-Job -ScriptBlock { (Get-WmiObject -Class Win32_Processor).Name }
Wait-Job $job_cpu
Receive-Job -Job $job_cpu -OutVariable job_cpu_output
$job_cpu_output > $temp_cpu
1
Guenther Schmitz 17 Фев 2020 в 07:41

Хорошо, я думаю, что вы правы в том, что Джобс действительно подходит, но с упомянутым вами переключателем -OutVariable он вообще не работает ... Любая идея, почему -OutVariable $job_cpu_out не удается выбрать до выхода из -Get-WmiObject?

$job_cpu         = Start-Job -ScriptBlock { (Get-WmiObject -Class Win32_Processor).Name }
$job_cpu_cores   = Start-Job -ScriptBlock { (Get-WmiObject -Class Win32_Processor).NumberOfCores }
$job_cpu_logical = Start-Job -ScriptBlock { (Get-WmiObject -Class Win32_Processor).NumberOfLogicalProcessors }
"Jobs created"
Wait-Job $job_cpu         | Out-Null ; Receive-Job -Job $job_cpu -OutVariable $job_cpu_out
Wait-Job $job_cpu_cores   | Out-Null ; Receive-Job -Job $job_cpu_cores -OutVariable $job_cpu_cores_out
Wait-Job $job_cpu_logical | Out-Null ; Receive-Job -Job $job_cpu_logical -OutVariable $job_cpu_logical_out
"CPU:       $job_cpu"
"CPU Cores: $job_cpu_cores_out"
"CPU Logical Cores: $job_cpu_logical_out"
0
YorSubs 17 Фев 2020 в 14:17