Могу ли я заставить && работать в Powershell? - PullRequest
136 голосов
/ 19 февраля 2009

&& общеизвестно трудно найти в Google, но лучшее, что я нашел, это эта статья , в которой говорится, что нужно использовать -and.

К сожалению, это не дает больше информации, и я не могу выяснить, что я должен делать с -and (опять же, общеизвестно трудная вещь для поиска)

Контекст, в котором я пытаюсь его использовать, это «выполнить cmd1, и в случае успеха выполнить cmd2», в основном это:

csc /t:exe /out:a.exe SomeFile.cs && a.exe

Это должно быть несколько простых повторений для тех, кто знает, спасибо!


Редактировать: Если вы просто хотите запустить несколько команд в одной строке, и вам все равно, не сработает ли первая или нет, вы можете использовать ; Для большинства моих целей это нормально

Например: kill -n myapp; ./myapp.exe.

Ответы [ 11 ]

127 голосов
/ 19 февраля 2009

В CMD «&&» означает «выполнить команду 1, а в случае успеха выполнить команду 2». Я использовал его для таких вещей, как:

build && run_tests

В PowerShell самое близкое, что вы можете сделать:

(build) -and (run_tests)

У него та же логика, но выводимый текст команд потерян. Может быть, это достаточно хорошо для вас.

EDIT

Если вы делаете это в сценарии, вам, вероятно, будет лучше разделить операторы, например:

build
if ($?) {
    run_tests
}
27 голосов
/ 21 февраля 2009

&& и || были в списке вещей для реализации (все еще есть), но не появлялись как следующая самая полезная вещь, которую нужно добавить. Причина в том, что у нас есть -AND и -OR. Если вы считаете, что это важно, отправьте предложение по Connect, и мы рассмотрим его для V3.

11 голосов
/ 08 октября 2014

Попробуйте это:

$errorActionPreference='Stop'; csc /t:exe /out:a.exe SomeFile.cs; a.exe
4 голосов
/ 25 октября 2018

Если ваша команда доступна в cmd.exe (что-то вроде python ./script.py, но не команда PowerShell, например ii . (это означает открытие текущего каталога с помощью проводника)), вы можете запустить cmd.exe в PowerShell. Синтаксис такой:

cmd /c "command1 && command2"

Здесь && предоставляется синтаксисом cmd, описанным в этом вопросе .

2 голосов
/ 11 октября 2017

Я пробовал эту последовательность команд в PowerShell:

Первый тест

PS C:\> $MyVar = "C:\MyTxt.txt"
PS C:\> ($MyVar -ne $null) -and (Get-Content $MyVar)
True

($MyVar -ne $null) возвращено true и (Get-Content $MyVar) также возвращено true .

Второй тест

PS C:\> $MyVar = $null
PS C:\> ($MyVar -ne $null) -and (Get-Content $MyVar)
False

($MyVar -ne $null) вернул ложь и до сих пор я должен предположить, что (Get-Content $MyVar) также вернул ложь .

Третий тест подтвердил, что второе условие даже не анализировалось.

PS C:\> ($MyVar -ne $null) -and (Get-Content "C:\MyTxt.txt")
False

($MyVar -ne $null) вернул false и подтвердил, что второе условие (Get-Content "C:\MyTxt.txt") не выполняется, вернув false по всей команде.

0 голосов
/ 17 декабря 2018

Подробный эквивалент - объединить $LASTEXITCODE и -eq 0:

msbuild.exe args; if ($LASTEXITCODE -eq 0) { echo 'it built'; } else { echo 'it failed'; }

Я не уверен, почему if ($?) не сработал для меня, но этот сработал.

0 голосов
/ 24 мая 2018

Обычно в 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>
0 голосов
/ 17 ноября 2017

Я думаю, что простое утверждение 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 }
0 голосов
/ 21 января 2017

Мы можем попробовать эту команду вместо использования && метода

попробуй {имя хоста; if ($ lastexitcode -eq 0) {ipconfig / all | findstr / i bios}} catch {echo err} finally {}

0 голосов
/ 08 мая 2015
if (start-process filename1.exe) {} else {start-process filename2.exe}

Это немного длиннее, чем "&&", но выполняет то же самое без сценариев и не слишком сложно запомнить. Лучше поздно, чем никогда. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...