Могу ли я заставить && работать в 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 {}

Другие вопросы по тегам