Как управлять потоком выполнения в Powershell на основе результата startWith()?

#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 для строковой переменной.