Могу ли я получить && для работы в Powershell?

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

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

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

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

Это должно быть легко несколько рецензий на кого-то, кто знает, спасибо!


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

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

Ответ 1

2019: команда Powershell рассматривает возможность добавления поддержки && в Powershell - оцените этот GitHub PR

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

build && run_tests

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

(build) -and (run_tests)

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

EDIT

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

build
if ($?) {
    run_tests
}

Ответ 2

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

Ответ 3

Попробуйте следующее:

$errorActionPreference='Stop'; csc /t:exe /out:a.exe SomeFile.cs; a.exe

Ответ 4

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

Тест Fisrt

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) возвращает 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") никогда не запускалось, возвращая false для всей команды.

Ответ 5

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

cmd /c "command1 && command2"

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

Ответ 6

Я думаю, что простая инструкция 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 }

Итак, для примера op это будет:

a=(csc /t:exe /out:a.exe SomeFile.cs); $test = $?; if ($test=$true) { a.exe }

Ответ 7

Обычно в 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>

Ответ 8

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

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

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

Ответ 9

Очень старый вопрос, но для новичков: возможно, версия PowerShell (похожая, но не эквивалентная), которую ищет вопрос, это точка с запятой. Как было показано выше, способ использования && без потери выходных данных заключается в следующем:

build_command; run_tests_command

Ответ 10

Это зависит от контекста, но вот пример "-and" в действии:

get-childitem | where-object { $_.Name.StartsWith("f") -and $_.Length -gt 10kb }

Таким образом, чтобы получить все файлы размером более 10 КБ в каталоге, имя файла которого начинается с "f".

Ответ 11

if (start-process filename1.exe) {} else {start-process filename2.exe}

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

Ответ 12

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

try {hostname; if ($ lastexitcode -eq 0) {ipconfig/all | findstr/i bios}} catch {echo err} наконец {}