Powershell에서 &&를 사용할 수 있습니까?


186

&&Google에서 검색하기가 악명 높지만 내가 찾은 최고는 이 기사 를 사용하는 것 -and입니다.

불행히도 더 이상 정보를 제공하지 않으며 내가해야 할 일을 찾을 수 없습니다 -and(다시 말해서 악명 높은 검색)

내가 사용하려는 컨텍스트는 "cmd1 실행, 성공하면 cmd2 실행"입니다. 기본적으로 다음과 같습니다.

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

이것은 아는 사람에게 쉬운 몇 가지 담당자가 될 것입니다. 감사합니다!


편집 : 그냥 한 줄에 여러 명령을 실행하려는 첫 번째 일이 실패하거나하지 않을 경우 당신은 당신이 사용할 수있는, 상관하지 않으면 ;내 목적의 대부분이 괜찮습니다

예를 들면 다음과 같습니다 kill -n myapp; ./myapp.exe..


PowerShell에는 논리 연산자가 있습니다. 운영자가 원하는 방식으로 작동하지 않습니까? 그렇다면 여기에 표현식을 게시 할 수 있습니다.
Mohit Chakraborty

이 질문을 참조하십시오, 원하는 것 : stackoverflow.com/questions/1917271/…
joshperry

2
누구든지 배쉬 스타일에 관심 &&||PowerShell은의 일부가되어 가고 : 기능에 대한 제발 투표 여기 .
mklement0

1
리터럴 (및 중요) 기호가있는 쿼리에 대해 웹 검색을 수행 할 필요성과 관련하여 SymbolHound 가 유용합니다. 다음은 질문과 관련된 몇 가지 예입니다. powershell && ; powershell-및 . DuckDuckGo 를 사용하는 경우를 통해 SymbolHound를 검색 할 수 있습니다 !sym.
nisavid

3
2019 년 6 월 업데이트 : PowerShell 팀이 구현 &&하고 있습니다 ||! GitHub PR
pilau

답변:


193

CMD에서 '&&'는 "명령 1을 실행하고 성공하면 명령 2를 실행합니다"를 의미합니다. 나는 그것을 다음과 같은 것들에 사용했다 :

build && run_tests

PowerShell에서 가장 가까운 작업은 다음과 같습니다.

(build) -and (run_tests)

논리는 동일하지만 명령의 출력 텍스트가 손실됩니다. 그래도 충분할 것입니다.

스크립트 에서이 작업을 수행하는 경우 다음과 같이 명령문을 분리하는 것이 좋습니다.

build
if ($?) {
    run_tests
}

2019/11/27 : 이제 &&운영자는 PowerShell 7 Preview 5 이상에서 사용할 수 있습니다 .

PS > echo "Hello!" && echo "World!"
Hello!
World!

2
RE : "그들이 제거 할 수있는 말도 안 돼요"-PowerShell을 "어리석은 부분을 제거한 CMD"라고 생각하지 않습니다. is.gd/k92B
Jay Bazuzi

90
PowerShell을 "멍청한 부분이 제거 된 CMD"로 생각하고 싶지 않습니다. 나는 "유용한 비트가없는 배쉬"로 생각하고 싶다.
포드

15
build ; if ($?) { run_tests }명령 줄 에서도 수행 할 수 있습니다 .
docwhat

19
PowerShell을 배울 때 실제로 좌절감을 느끼는 가장 빠른 방법은 확장 된 CMD 또는 bash라고 생각하여 시작하는 것입니다. 또한, 근본적으로 다른 모델을 보유 epecially 는 입력, 출력, 배관 및 결과에 관해서. 좋은 튜토리얼 또는 개요로 시작하고 다른 쉘의 구문을 작동시키기 위해 너무 열심히 노력하지 마십시오. 자체 용어로 가져와야합니다.
Mark Meuer

3
자체 용어로 PowerShell을 사용하여 명령을 실행 한 다음 해당 명령이 성공한 경우에만 다른 명령을 실행하려면 어떻게해야합니까? 나는 그것이 bashPowerShell에 대한 아이디어를 강요한다고 생각하지 않습니다 . 기본 쉘 기능입니다. 지금까지 내가 본 것 중 가장 좋은 것은 build ; if ($?) { run_tests }지금부터 사용할 것입니다. PowerShell 팀이 &&지원을 추가 하기를 바랍니다 .
Nate

28

&& 및 || 구현 할 것들 (여전히) 목록에 있었지만 다음으로 추가 할 가장 유용한 것으로 나타나지 않았습니다. 그 이유는 -AND 및 -OR이 있기 때문입니다. 중요하다고 생각되면 Connect에 제안을 제출하고 V3에 대해 제안합니다.


11
Connect에 가입하고 Powershell을 추천했지만 제안을하는 방법을 알 수 없습니다. 연결 웹 사이트는 :-( 정말 복잡하고 혼란입니다
오리온 에드워즈


22
당신은 질문이 동등한를 작성, 당신은의 예를 추가 한 경우 당신의 대답은 더 많은 도움이 될 것입니다 방법을 아직도, 알고 사용 -AND
Kyeotic

5
거의 영원을 위해 창보다 오래된 시스템에서 사용되는 기본 흐름 제어 도구이기 때문에 중요합니다. 따라서 리눅스와 윈도우의 또 다른 주요 차이점이 있습니다.
airtonix

6
Jeffrey Snover가 듣고 있기를 바랍니다. 이것이 지금까지 그것을 구현할 충분한 이유가되어야합니다. 너무 길어서 이제는 VSCode가 Windows에서 기본 터미널로 사용하는 것처럼 PowerShell이 ​​제자리에서 팝업되기 시작합니다. 이것은 &&없이 전체 고통이며, -and먹는 것은 전혀 같지 않습니다.
Ciantic

13

이 시도:

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

9
참고 : 첫 번째 명령이 실패하면 두 번째 명령이 계속 실행됩니다.
BrunoLM

4
기본 설정 변수 $ErrorActionPreferencecmdlet 에 의해보고 된 종료되지 않는 오류 를 처리 하는 방법 만 제어합니다 . 외부와 같은 유틸리티 csca.exe결코 (그들은 단지 그들의 출구의 상태를 반영하는 등의 오류를보고 $?성공 플래그 ()와 $LASTEXITCODE, 그래서 당신의 명령 줄 양 (특정 종료 코드를보고)) 무조건 실행 명령 (에 해당하는 cmd'들 csc /t:exe /out:a.exe SomeFile.cs & a.exe)
mklement0

5

cmd.exe에서 명령을 사용할 수있는 경우 (이것은 Explorer에서 현재 디렉토리를 여는 것을 의미하는 python ./script.pyPowerShell 명령 과 같지만 ii .) PowerShell에서 cmd.exe를 실행할 수 있습니다. 구문은 다음과 같습니다.

cmd /c "command1 && command2"

여기 에이 질문에&& 설명 된 cmd 구문이 제공됩니다 .


4
추가 기능에 액세스하려면 cmd로 업그레이드하십시오.
Bill K

4

PowerShell에서이 명령 시퀀스를 시도했습니다.

Fisrt 테스트

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)반환 거짓 지금까지 나는 가정해야 (Get-Content $MyVar)또한 반환 거짓을 .

세 번째 테스트는 두 번째 조건이 분석되지 않았 음을 입증했습니다.

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

($MyVar -ne $null)반환 거짓 과 두 번째 조건이 입증 (Get-Content "C:\MyTxt.txt")반환하여, 실행 결코 거짓을 전체 명령에.


네 말이 맞아! 이것은 && 연산자로 작동합니다. 오른쪽의 $ ()조차도 이것을 평가할 수 없습니다!
팔코 알렉산더

2

아주 오래된 질문이지만 새로 온 사람들에게는 질문이 찾고 있는 PowerShell 버전 (유사하지만 동등한 것은 아님 ) -and은 다음과 같이 사용 하는 것입니다.

(build_command) -and (run_tests_command)


1
이것은 사용 사례에는 문제가 없지만 &&의 종료 코드를 무시한다는 점에서 동작하지 않습니다 build_command.
Simon Buchan

이것은 분명히 올바른 일을하지 않습니다. 첫 번째 명령이 실패하더라도 두 번째 명령을 실행합니다.
Nate

이것은 완전히 잘못되었습니다. cmd 및 bash에서 와 ;동일합니다 . cmd 와 &;&&
정확히

또한 두 프로세스 모두에 대해 STDOUT 및 STDERR을 음소거합니다.
Dragas

0

상황에 따라 다르지만 "-and"의 예는 다음과 같습니다.

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

파일 이름이 "f"로 시작하는 디렉토리에서 10kb보다 큰 모든 파일을 가져옵니다.


1
이것은 여러 명령을 실행하는 것에 대한 원래 질문에 대한 답변이 아닙니다.
bdukes

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

"&&"보다 약간 길지만 스크립팅없이 동일한 작업을 수행하며 기억하기 어렵지 않습니다. 안하는 것보다 늦게하는 것이 낫다. :)


2
Start-Process일반적으로 명령 줄 유틸리티를 호출하는 데 사용하는 잘못된 도구입니다. 여기에 사용 된 구체적으로, Start-Process실행 filename1.exe새로운 콘솔 창 및 반환에 비동기 적으로 아무것도 부울 상황에 맞는 평가하여의에, $false. Start-Process(명령 줄 유틸리티를 직접 호출하는 방법 인) 생략하더라도 조건부 결과는 유틸리티가 stdout 출력을 생성했는지 여부에 따라 달라지기 때문에 접근 방식이 부족합니다. 성공 여부.
mklement0

0

간단한 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 }

0

장황한 상응하는 결합하는 것입니다 $LASTEXITCODE-eq 0:

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

나는 왜 if ($?)나를 위해 일하지 않았는지 잘 모르겠지만 , 이것은 나를 위해 일했다.


-1

&& 메소드를 사용하는 대신이 명령을 시도 할 수 있습니다

{호스트 이름; if ($ lastexitcode -eq 0) {ipconfig / all | findstr / i bios}} 캐치 {echo err} 마침내 {}


필요가 없습니다 try/ catch그것이에만 필요하기 때문에, 종료 오류, 외부와 같은 유틸리티있는 hostname, ipconfig그리고 findstr트리거 할 수는. $LASTEXITCODE외부 $?cmdlet에 의해 설정된 특정 종료 코드를 알고 싶은 경우에만 검사 가 필요합니다 . 기본 cmdlet과 마찬가지로 추상 성공 또는 실패가 반영됩니다 .
mklement0

@Cyberiron이 올바른 길을 가고 있다고 생각합니다. &&유닉스에서는 }나중에 명령을 단락 (건너 뛰기) 할 때 후속 명령을 새 블록 (즉 ) 으로 랩핑 할 필요가 없다는 점에서 try / catch와 비슷 하다고 생각 합니다. 필자 는 PowerShell 로 이식 하는 데 매우 유용한 대체 도구가 될 AmpAmp때 발생 하는 함수 / 필터를 생각 합니다. 사용법 :if (!?) { throw "last command failed" }&&csc /t:exe /out:a.exe SomeFile.cs; AmpAmp; a.exe
yzorg
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.