Оператор, не распознанный с помощью Invoke-выражения в PowerShell

#powershell

#powershell

Вопрос:

Я пытаюсь запустить команду docker в сценарии PowerShell и проверить, не была ли команда выполнена успешно, но мне это не удается. Я использую:

 if (!Invoke-Expression -Command docker ps -q -f name=php72) {
    #some other code here
}
  

Ошибка, которую я получаю после запуска этого:

 Line |
  31 |  if (!Invoke-Expression -Command docker ps -q -f name=php72) {
     |      ~~~~~~~~~~~~~~~~~~
     | The term '!Invoke-Expression' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a
     | path was included, verify that the path is correct and try again.
  

Я -not также пробовал оператор безрезультатно.

Ответ №1:

Добавьте еще одну скобку:

 if (!(Invoke-Expression -Command docker ps -q -f name=php72)){
    #some other code here
}
  

Если здесь !Invoke-Expression не вычисляется, что недопустимо.

Лучший способ — использовать так:

 docker ps -q -f name=php72 >$null 2>amp;1
if($lastExitCode -eq 1){"FAILED!"}
  

Ответ №2:

Ваш синтаксис неверен. В PowerShell есть 2 режима синтаксического анализа: выражение и аргумент. Последний — это тот, в котором вы работаете с командами. Там имя команды (например Invoke-Expression ) всегда должно быть первым.

Короче говоря: вы должны обернуть команду либо с помощью оператора группировки, () либо с помощью оператора подвыражения $() , чтобы использовать ее внутри выражения:

 -not (Invoke-Expression ...)
# or
-not $(Invoke-Expression ...)
  

( -not и ! работают точно так же)

Но, как указал @WasifHasan, docker — это внешняя программа, поэтому лучший способ проверить успех — использовать $? автоматическую переменную, которая будет иметь $false значение if $LASTEXITCODE , отличное от любого другого значения 0 :

 docker ps -q -f name=php72 2>amp;1>$null
if ($?} {
    # your other code here
}