Я работаю над пользовательской строкой состояния PowerShell и реализовал несколько интересных функций: мониторинг батареи, мониторинг Wi-Fi и т. Д. К сожалению, они, как правило, обновляются медленно, так как требуют вызовов Get-NetAdapterStatistics, получения объектов wmi, и другие очень медленные звонки. Я пытаюсь порождать дочерние процессы с помощью start-job, чтобы обеспечить фоновый опрос и обновление общей переменной, но не могу понять, как это сделать. Лучшая возможная замена, которую я нашел, - это своего рода IPC (как описано здесь: Конвейер между двумя процессами SEPARATE Powershell ), но я бы предпочел придерживаться традиционной разделяемой переменной, если это возможно. Есть ли способ сделать это? Лучшая альтернатива, которую я нашел, это передача переменных в качестве аргументов, но это не позволяет проводить опрос.
К слову, я знаю, что это не совсем то, для чего предназначен PowerShell, но мне все еще интересно, возможно ли это. Или лучше всего написать двоичный файл c / c ++, который будет возвращать строку состояния? Записать в файл (кажется, что это может быть медленно)? Дайте мне знать, что может сработать, если вы можете, или если вам нужна дополнительная информация. Спасибо.
Дополнительная информация:
Start-Job -Name testJob -Script {
$testVar = "asdf"
}
Write-Host $testVar
# should output asdf
Есть ли способ сделать это? Я пытаюсь сделать некоторую работу и вернуть переменную. Как это возможно? Единственные возможные пути, которые я нашел:
Запись файла на диск, который немного медленный
Использовать канал IPC:
$pipe = New-Object System.IO.Pipes.NamedPipeClientStream '.',"testPipe",'In'
Start-Job -Name testJob -Script {
$pipe = New-Object System.IO.Pipes.NamedPipeServerStream "testPipe",'Out'
$pipe.WaitForConnection()
$sw = New-Object System.IO.StreamWriter $pipe
$sw.AutoFlush = $true
$sw.writeLine("foo")
While ($true) {
# do looping and polling, then print stuff
$sw.writeLine($pollResult)
}
$sw.Dispose()
$pipe.Dispose()
}
$pipe.Connect()
$sr = New-Object System.IO.StreamReader $pipe
#when necessary, read info
$output = $sr.ReadLine()
$sr.Dispose()
$pipe.Dispose()
Самым большим недостатком этого является то, что это немного глючно. Самое главное, я не знаю, как закрыть канал IPC, когда я закрываю окно powershell (так как это строка состояния), и в результате я получаю «утечку канала», которая приводит к высокой загрузке процессора и процессам powershell, выполняющимся в фон. По крайней мере, это не относится к прямой фоновой работе, записывающей в файл. Очевидно, что канал должен закрываться при удалении последней ссылки, но фоновое задание продолжает работать с ним открытым. Это связано с тем, что сеанс powershell будет зависать до такой степени, что его нельзя будет нажать ctrl-c, когда он ожидает чего-то связанного с каналом (при ожидании соединения с каналом, для завершения записи строки и т. Д.).
Спасибо, и, пожалуйста, дайте мне знать, если я смогу добавить больше информации.
Обновление: я пытался использовать пустые файлы в основном в качестве контрольных флагов (я думаю, это было бы быстрее, чем анализ одного файла для каждого параметра), но я пытаюсь использовать задание для возврата информации VCS (что было бы проще просто возвращайся и быстрее). Есть идеи, как решить эту проблему? Я в тупике.
Примечание: я пометил этот C #, потому что powershell использует конвейерные функции C #, и я надеюсь, что кто-то со знанием этого сможет помочь.