#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
}