Могу ли я заставить && работать в Powershell?
&&
общеизвестно, что трудно найти в Google, но лучшее, что я нашел, это статья, в которой говорится, чтобы использовать -and
,
К сожалению, это не дает больше информации, и я не могу выяснить, что я должен делать с -and
(опять же, общеизвестно трудная вещь для поиска)
Контекст, в котором я пытаюсь использовать это: "выполнить cmd1, и в случае успеха выполнить cmd2", в основном это:
csc /t:exe /out:a.exe SomeFile.cs && a.exe
Это должно быть несколько простых повторений для тех, кто знает, спасибо!
Редактировать: если вы просто хотите запустить несколько команд в одной строке, и вам все равно, если первая не работает или нет, вы можете использовать ;
Для большинства моих целей это нормально
Например: kill -n myapp; ./myapp.exe
,
16 ответов
В CMD "&&" означает "выполнить команду 1, а в случае успеха выполнить команду 2". Я использовал его для таких вещей, как:
build && run_tests
В PowerShell самое близкое, что вы можете сделать, это:
(build) -and (run_tests)
У него та же логика, но выходной текст из команд потерян. Может быть, это достаточно хорошо для вас, хотя.
РЕДАКТИРОВАТЬ
Если вы делаете это в скрипте, вам, вероятно, будет лучше разделить операторы, например так:
build
if ($?) {
run_tests
}
&& и || были в списке вещей для реализации (все еще есть), но не появлялись как следующая самая полезная вещь, которую нужно добавить. Причина в том, что у нас есть -AND и -OR. Если вы считаете это важным, пожалуйста, отправьте предложение по Connect, и мы рассмотрим его для V3.
Попробуй это:
$errorActionPreference='Stop'; csc /t:exe /out:a.exe SomeFile.cs; a.exe
Если ваша команда доступна в cmd.exe (что-то вроде python ./script.py
но не команда PowerShell, как ii .
(Это означает открыть текущий каталог через проводник)), вы можете запустить cmd.exe в PowerShell. Синтаксис такой:
cmd /c "command1 && command2"
Вот, &&
обеспечивается синтаксисом cmd, описанным в этом вопросе.
Я попробовал эту последовательность команд в PowerShell:
Первый тест
PS C:\> $MyVar = "C:\MyTxt.txt"
PS C:\> ($MyVar -ne $null) -and (Get-Content $MyVar)
True
($MyVar -ne $null)
вернул и (Get-Content $MyVar)
также вернул истину.
Второй тест
PS C:\> $MyVar = $null
PS C:\> ($MyVar -ne $null) -and (Get-Content $MyVar)
False
($MyVar -ne $null)
вернул false и пока я должен принять (Get-Content $MyVar)
также вернул false.
Третий тест доказал, что второе условие даже не анализировалось.
PS C:\> ($MyVar -ne $null) -and (Get-Content "C:\MyTxt.txt")
False
($MyVar -ne $null)
вернул false и доказал второе условие (Get-Content "C:\MyTxt.txt")
никогда не бежал, возвращая ложь на всю команду.
Очень старый вопрос, но для новичков: возможно, версия PowerShell (похожая, но не эквивалентная), которую ищет вопрос, это точка с запятой. Как было рассмотрено выше, способ использования &&
без потери вывода выглядит следующим образом:
build_command; run_tests_command
Просто установите PowerShell 7 (перейдите сюда, прокрутите и разверните раздел ресурсов). В этом выпуске реализованы операторы цепочки конвейеров.
Подробный эквивалент состоит в том, чтобы объединить $LASTEXITCODE
а также -eq 0
:
msbuild.exe args; if ($LASTEXITCODE -eq 0) { echo 'it built'; } else { echo 'it failed'; }
Я не уверен почему if ($?)
не сработало для меня, но этот сработал.
в 2023 году вы можете использовать;
оператор в PowerShell.
&&
кажется, не работает.
Я также столкнулся с той же проблемой. Причина в том, что я использую старую версию powershell (у меня уже Windows 11). Чтобы проверить версию, введите это в powershell:$PSVersionTable
Я обнаружил, что на самом деле использую версию 5, а последняя — 7.4.
PSVersion 5.1.22621.963
PSEdition Desktop
После установки последней версии (вы можете загрузить ее отдельно или просто зайти в Microsoft Store) и убедитесь, что вы успешно переключились на новую версию (вам может потребоваться дополнительная конфигурация, чтобы выбрать эту версию, так как она устанавливает новую версию, а не заменяет старую)
PSVersion 7.3.2
PSEdition Core
После перехода на последнюю версию&&
работает отлично.
Я думаю, что простое заявление if может сделать это. Как только я увидел ответ mkelement0 выше, что последний статус выхода хранится в $?, Я собрал следующее:
# Set 1st command to variable
$a=somecommand
# Temp var to store exit status of last command (since we can't write to $?)
$test=$?
# Run Test
if ($test=$true) { 2nd-command }
Так что для примера оп, это будет:
a=(csc /t:exe /out:a.exe SomeFile.cs); $test = $?; if ($test=$true) { a.exe }
if (start-process filename1.exe) {} else {start-process filename2.exe}
Он немного длиннее, чем "&&", но выполняет то же самое без сценариев и не слишком сложен для запоминания. Лучше поздно, чем никогда.:)
Обычно в Linux я бы делал что-то вроде:ruby -c learn.rb && foodcritic learn.rb
Однако на Windows PS не могу этого сделать! Так что я просто сделал .ps1
файл с этим:
Param(
[string]$fileName
)
ruby -c $fileName
foodcritic $fileName
и назвал это bamemeril.ps1
PS C:\Users\riotc> .\bamemeril.ps1 learn.rb
Syntax OK
Checking 1 files
x
FC011: Missing README in markdown format: ../README.md:1
FC031: Cookbook without metadata.rb file: ../metadata.rb:1
FC071: Missing LICENSE file: ../LICENSE:1
PS C:\Users\riotc>
Используйте; & вместо &&
csc /t:exe /out:a.exe SomeFile.cs ;& a.exe
Это зависит от контекста, но вот пример "-and" в действии:
get-childitem | where-object { $_.Name.StartsWith("f") -and $_.Length -gt 10kb }
Таким образом, все файлы размером более 10 КБ попадают в каталог, имя файла которого начинается с "f".
Мы можем попробовать эту команду вместо использования && метода
попробуй {имя хоста; if ($lastexitcode -eq 0) {ipconfig /all | findstr /i bios}} catch {echo err} finally {}