Я новичок в PowerShell и пытаюсь написать сценарий, который зависит от состояния виртуальной машины Hyper-V. Вот мой (основной) оператор if:
if((get-vm WMDC2 | out-string) -like '*Running*') { echo "running"}
Я чувствую, что должен быть лучший способ сделать это, но я не знаю, что это такое. Я не думаю, что это плохой способ сделать это, но, пытаясь учиться, я хотел бы знать, есть ли способ лучше, и если это является плохой способ сделать это, почему.
РЕДАКТИРОВАТЬ:
Как упоминалось в первом ответе, моя единственная идея заключалась в том, чтобы преобразовать в строку, чтобы проверить свойства объекта на то, что я ищу. Я бы хотел, чтобы был способ сделать это без преобразования вывода в строку, и это, по сути, то, что я ищу.
В Format-*
командлеты (ваш fl
является Format-List
) предназначены для форматирования вывода для просмотра в консоли. Не выполняйте повторный синтаксический анализ их значений. Соберите объект (ы), возвращенный Get-VM
и получить доступ к свойствам напрямую.
# Get the VM object
$vm = Get-VM WMDC2
# check if the 'state' property equals 'Running'
if ($vm.state -eq 'Running') {
Write-Host 'Running'
}
И если вы по какой-то причине категорически не хотите хранить объект виртуальной машины, вы также можете сократить его так.
if ((Get-VM WMDC2).state -eq 'Running'){
Write-Host 'Running'
}
Я не думаю, что это плохой способ сделать это
Это плохой способ сделать это, но это не ваша вина. Часто начинающие Powershellers прыгают и начинают пытаться все натянуть. Не углубляясь слишком далеко в объекты Powershell, худшая часть этого подхода заключается в том, что вы теряете встроенную полезность (свойства, методы, конвейерные возможности) объекта, возвращаемого Get-VM
.