source

Bash의 && 및 || 연산자의 PowerShell 등가물은 무엇입니까?

myloves 2023. 9. 5. 22:00

Bash의 && 및 || 연산자의 PowerShell 등가물은 무엇입니까?

Bash에서 나는 쉽게 다음과 같은 것을 할 수 있습니다.

command1 && command2 || command3

즉, command1을 실행하고 command1이 command2를 실행하는 데 성공하고 command1이 command3를 실행하지 못하는 경우입니다.

PowerShell의 동등한 기능은 무엇입니까?

업데이트: PowerShell(Core),v7+에서는 파이프라인 체인 운영자라고 합니다. 자세한 내용은 이 답변을 참조하십시오.


이 질문이 처음 제기된 지 여러 해가 지난 후, 최신 버전이자 최종 버전이 v5.1인 Windows PowerShell의 동작요약해 보겠습니다.

  • Bash의 / 및 제어 연산자에는 PowerShell에 해당되지 않으며 PowerShell에서 사용자 지정 연산자를 정의할 수 없으므로 다음과 같은 좋은 해결 방법이 없습니다.

    • 별도의 명령어 사용(별도의 행 또는 다음으로 구분);), 자동 변수를 통해 각 명령의 성공 상태를 명시적으로 테스트합니다. 예:

      # Equivalent of &&
      command1 -arg1 -arg2; if ($?) { command2 -arg1 }
      
      # Equivalent of ||
      command1 -arg1 -arg2; if (-not $?) { command2 -arg1 } 
      
    • 자동 변수를 사용하는 외부 프로그램에 대한 더 나은 대안. 이는 다음과 같은 이유로 선호됩니다.$?윈도우즈 PowerShell에서 잘못된 (더 이상 PowerShell(Core) 7.2+에서는 없음)이 발생할 수 있습니다.2>리디렉션이 포함되어 있습니다. 다음 답변을 참조하십시오.

      # Equivalent of &&
      command1 -arg1 -arg2; if ($LASTEXITCODE -eq 0) { command2 -arg1 }
      
      # Equivalent of ||
      command1 -arg1 -arg2; if ($LASTEXITCODE -ne 0) { command2 -arg1 } 
      
    • PowerShell의 PowerShell을 사용하는 하십시오.-and그리고.-or일반적으로 해결책이 아닙니다.

  • [PowerShell(Core) 7+에 구현된 이후] 얼마 전에 추가에 대한 논의가 있었지만, 목록의 상위권에 오르지는 못한 것 같습니다.

    • 이제 PowerShell이 오픈 소스로 전환되었기 때문에 GitHub에서 문제가 발생했습니다.
    • 토들&&그리고.||현재 PowerShell에서 향후 사용할 수 있도록 예약되어 있으므로 Bash와 동일한 구문을 구현할 수 있을 것으로 기대됩니다.
      (PSv5.1 기준으로, 다음과 같은 시도가 있습니다.1 && 1 메시지 오류메를표시니다합지시▁error▁message를 생성합니다.The token '&&' is not a valid statement separator in this version.)

PowerShell의을 선택해야 -and그리고.-or 할 수는 없습니다.&&그리고.||:

Bash의 통제 연산자&&AND) 및 (단락 논리 AND) »||(단락 논리 OR) 출력 스트림을 방해하지 않고 종료 코드를 기준으로 명령의 성공 상태를 암시적으로 확인합니다. 예:

ls / nosuchfile && echo 'ok'

신경쓰지 말아요.lsoutput (에 있는 -- 둘 stdout 출력의파다일의(출력)d파일▁outputs)/및 출력하지 않는 파일에 할 때 ) stderr 및출 재하 하려고 스생발때하는할세에류오지메시일지액는파않exist▁)존▁st▁(der▁and력출()는the메하▁from류생시▁outputnosuchfile) -- 통과되지만,&&의 (잘못된) 종료 코드를 확인합니다.ls명령어를 사용하여 다음을 결정합니다.echo-명 - 의 &&제어 연산자 - 실행해야 합니다.

ls 코드 포트종코드1이 경우, 신호 실패 -- 파일 때문입니다.nosuchfile존재하지 않습니다 -- 그래서.&&는 으로 결정합니다.ls 실패하고, 단락 편집을 적용함으로써, 다음과 같이 결정합니다.echo명령을 실행할 필요가 없습니다.
종료 코드임을 유의하십시오.0의 세계에서 성공을 알리는.cmd.exe그리고.bash0이 아닌 종료 코드는 실패를 나타냅니다.

즉, Bash 및 는 명령출력완전히 독립적으로 작동하며 명령의 성공 상태에만 영향을 미칩니다.


이와 대조적으로 PowerShell 및 명령의 표준(성공) 출력에만 작용하여 이를 소비다음 작업의 부울 결과만 출력합니다.

(Get-ChildItem \, nosuchfile) -and 'ok'

위 내용:

  • 성공(표준) 출력을 사용하고 소비합니다. 목록\그리고 이를 부울로 해석합니다. 비어 있지 않은 입력 컬렉션으로 간주됩니다.$true 이상의, 표현식은 부컨텍에, 서래만하항적있다, 면다목평니됩가같이울로 됩니다.$true.

    • 그러나 존재하지 않는 파일로 인한 오류 정보nosuchfile 오류가 별도의 스트림으로 전송되므로 를 통과합니다.
  • 점을 하면,Get-ChildItem \, nosuchfile 있지 않은 출력을 합니다. 한 값은 " 출반다않성환니"입니다. LHS는 다음 값으로 평가됩니다.$true,그렇게-and RHS도 합니다.'ok'그러나 다시, 출력을 소비하고 이를 부울로 해석하며, 비어 있지 않은 문자열로 평가하기도 합니다.$true.

  • 따서인, 전적결의 과 같습니다.-and은 은현표입니다.$true(유일한 성공) 출력입니다.

순효과는 다음과 같습니다.

  • 양측의 성공적인 결과물-and식은 평가 중에 사용되므로 효과적으로 숨겨집니다.

  • 식의 유일한 (성공) 출력은 다음과 같은 부울 결과입니다.$true (은 이경로우 (렌링함더로)함▁as)로 렌더링 됩니다.True종점에 있음).

Bash는 논리 연산자에 전달될 때 명령의 정수 종료 코드를 true 또는 false로 해석해야 합니다.PowerShell은 이 작업을 수행하지 않지만 명령을 래핑하고 동일한 동작을 생성하는 기능을 만들 수 있습니다.

> function Get-ExitBoolean($cmd) { & $cmd | Out-Null; $? }

($?는 마지막 종료 코드의 성공을 포함하는 부울입니다.)

지정된 두 개의 배치 파일:

#pass.cmd
exit

그리고.

#fail.cmd
exit /b 200

...동작을 테스트할 수 있습니다.

> if (Get-ExitBoolean .\pass.cmd) { write pass } else { write fail }
pass
> if (Get-ExitBoolean .\fail.cmd) { write pass } else { write fail }
fail

논리 연산자는 Bash에서와 동일한 방식으로 평가되어야 합니다.먼저 별칭을 설정합니다.

> Set-Alias geb Get-ExitBoolean

테스트:

> (geb .\pass.cmd) -and (geb .\fail.cmd)
False
> (geb .\fail.cmd) -and (geb .\pass.cmd)
False
> (geb .\pass.cmd) -and (geb .\pass.cmd)
True
> (geb .\pass.cmd) -or (geb .\fail.cmd)
True

[void]를 사용하여 부울 출력을 숨기고 부작용만 얻을 수 있는 이런 작업할 수 있습니다.이 경우 $a 또는 $b가 null이면 $c가 $result에 할당됩니다.할당은 표현식이 될 수 있습니다.

$a = ''
$b = ''
$c = 'hi'

[void](
  ($result = $a) -or
  ($result = $b) -or
  ($result = $c))

$result

산출량

hi

파워셸에서 && 메소드를 사용하는 대신 try catch finally 메소드를 사용할 수 있습니다.

try {hostname} catch {echo err} finally {ipconfig /all | findstr bios}

언급URL : https://stackoverflow.com/questions/2416662/what-are-the-powershell-equivalents-of-bashs-and-operators