вывод команды powershell processing - PullRequest
0 голосов
/ 22 мая 2018

Я надеюсь, что смогу получить здесь руку помощи.Мне нравятся сценарии оболочки Linux, и я решил попробовать Windows Powershell для решения следующей задачи, и у меня не получается.

Я хочу выполнить следующую команду, которая выводит температуру графического процессора и загрузку процессора в качестве четвертого и5 колонны.Если 4-й столбец опускается ниже 50 или 5-й столбец опускается ниже 80, я хочу перезагрузить систему.

"C:\Program Files\NVIDIA Corporation\NVSMI>nvidia-smi" --query-gpu=timestamp,name,pci.bus_id,temperature.gpu,utilization.gpu,utilization.memory --format=csv -l 5

Пример того, что команда печатает каждые 5 секунд:

2018/05/21 21:21:54.118, GeForce GTX 1060 6GB, 00000000:01:00.0, 63, 100 %, 93 %
2018/05/21 21:21:59.121, GeForce GTX 1060 6GB, 00000000:01:00.0, 64, 100 %, 95 %
2018/05/21 21:22:04.122, GeForce GTX 1060 6GB, 00000000:01:00.0, 64, 100 %, 94 %

Я легко могу сделать это с помощью bash, как бы я подошел к этому с Powershell?Я надеюсь, что это поможет мне понять Powershell.Спасибо.

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Я начинаю понимать это.Для меня все еще волшебно, что Powershell знает реальные имена для вывода.Как это происходит?Он просматривает параметры, которые я передал команде?

Вот мой новый код, который останавливает процесс ethminer и перезапускает его, если temp меньше 50. Проблема в том, что, как только он перезапускает ethminer, я его жду120 секунд, но следующая итерация цикла - это температура 120 секунд назад.Нужно ли прерывать цикл или есть классный способ Powershell сказать ему использовать последний вывод?

$cmd = "& 'C:\Program Files\NVIDIA Corporation\NVSMI\nvidia-smi' --query-gpu=timestamp,name,pci.bus_id,temperature.gpu,utilization.gpu,utilization.memory --format=csv -l 5"

invoke-expression $cmd | ConvertFrom-CSV | ForEach-Object {
  $_
  if ([int]$_.'temperature.gpu' -lt 50) {
    "temp $($_.'temperature.gpu') is less than 50 restarting ethminer"
    $process = Get-Process -Name "ethminer"
    Stop-Process -InputObject $process
    Get-Process | Where-Object {$_.HasExited}
    Start-Process "C:\Users\svill\Desktop\start - gpu 1.bat.lnk"
    Start-Sleep -s 120
  }
}

Обновление: Вот рабочая версия кода, запускающего команду снова и снова с 1строка вывода:

$cmd = "& 'C:\Program Files\NVIDIA Corporation\NVSMI\nvidia-smi' --query-gpu=timestamp,name,pci.bus_id,temperature.gpu,utilization.gpu,utilization.memory --format=csv"

while($true)
{
  invoke-expression $cmd | ConvertFrom-CSV | ForEach-Object {
    $_
    if ([int]$_.'temperature.gpu' -lt 45) {
      "temp $($_.'temperature.gpu') is less than 45 restarting ethminer"
      $process = Get-Process -Name "ethminer"
      Stop-Process -InputObject $process
      Get-Process | Where-Object {$_.HasExited}
      Start-Process "C:\Users\svill\Desktop\start - gpu 1.bat.lnk"
      Start-Sleep -s 60
    }
    Start-Sleep -s 5
  }
}
0 голосов
/ 22 мая 2018

Самым большим препятствием, которое нужно преодолеть, является объектная ориентация PowerShell.

Чтобы начать вас на знакомой территории, вы можете использовать регулярное выражение для анализа чисел в строке.

PS C:\src\t> $s = '2018/05/21 21:21:54.118, GeForce GTX 1060 6GB, 00000000:01:00.0, 63, 100 %, 93 %'
PS C:\src\t> $s -match '.*, (\d*) %, (\d*) %$'
True
PS C:\src\t> $Matches

Name                           Value
----                           -----
2                              93
1                              100
0                              2018/05/21 21:21:54.118, GeForce GTX 1060 6GB, 00000000:01:00.0, 63, 100 %, 93 %


PS C:\src\t> $Matches[1]
100
PS C:\src\t> $Matches[2]
93

Покажите нам часть кода, который вы можете создать из этого, и у кого-то, вероятно, будут предложения по дальнейшему развитию.

...