#powershell #if-statement #wmi #startswith
#powershell #if-statement #wmi #startswith
Вопрос:
Пытаюсь заставить этот простой оператор работать, и я не могу понять, почему он не выдает правильный результат.
$asset = "get-wmiobject -class win32_computersystem | select Name"
if ($asset.StartsWith("ME")) {
echo "Asset tag is ok" }
Else
{ echo "Asset tag needs updating" }
По какой-то причине, несмотря на то, что результатом запроса WMI является, например, «ME12345», код выводит «Тег актива нуждается в обновлении».
Нужно ли мне использовать /F
или что-то еще, чтобы заставить IF
оператор работать с результатом из оператора WMI?
Ответ №1:
Ваша команда заключена в двойные кавычки, поэтому вы передаете строку команды, а не фактическое возвращаемое значение.
Когда вы меняете его на команду и возвращаете значение, это объект со свойством Name
, и он не содержит метода «StartsWith», вместо этого вы можете использовать оператор сравнения, и ниже я использовал регулярное выражение, которое соответствует строкам, начинающимся с «ME».
Вы, вероятно, захотите использовать CIMInstance
, поскольку это новая версия WMIObject
.
$asset = Get-CimInstance -Class win32_computersystem | Select Name
if ($asset.Name -match "^ME") {
Write-Output "Asset tag is ok"
}
Else {
Write-Output "Asset tag needs updating"
}
Комментарии:
1. Я знал, что это будет что-то простое, спасибо — это сработало.
Ответ №2:
Попробуйте это:
$asset = iex 'get-wmiobject -class win32_computersystem | select -expand Name'
if ($asset.tostring().StartsWith("ME")) {
echo "Asset tag is ok" }
Else
{ echo "Asset tag needs updating" }
На $asset
самом деле вы не выполняете строку, она остается строкой, вам нужно использовать iex
или Invoke-Expression
для вызова выражения, затем использовать развернуть значение свойства и выполнить StartsWith
для строковой переменной.