programing

조건부 실행 (&& 및 ||)

subpage 2023. 10. 1. 19:27
반응형

조건부 실행 (&& 및 ||)

이미 제 문제를 해결하는 질문이 있습니다(Powershell에서 &&을 일할 수 있을까요?). 하지만 한 가지 차이점이 있습니다.두 명령 모두 출력이 필요합니다.내가 그냥 달려가면,

(command1 -arg1 -arg2) -and (command2 -arg1)

출력은 보이지 않지만 stderr 메시지가 표시됩니다.그리고, 예상대로, 그냥 타이핑:

command1 -arg1 -arg2 -and command2 -arg1 

구문 오류를 제공합니다.

2019: 파워셸 팀은 파워셸에 대한 지원을 추가하는 것을 고려하고 있습니다 - 이 GitHub PR에 참여합니다.

시도해 보기:

$(command -arg1 -arg2 | Out-Host;$?) -and $(command2 -arg1 | Out-Host;$?)

$()는 파이프라인을 포함한 여러 문을 지정할 수 있는 하위 표현식입니다.그런 다음 명령과 파이프를 실행합니다.Out-Host보실 수 있습니다.다음 문장(하위 식의 실제 출력)이 출력되어야 합니다.$?마지막 명령의 성공 결과입니다.


$?네이티브 명령(console exe's)의 경우는 잘 작동하지만 cmdlet의 경우는 부족한 점이 있습니다.그것은,$?돌아오는 것만 같습니다.$falsecmdlet에서 종료 오류가 발생했을 때.그런 것 같습니다.$?최소한 세 가지 상태(failed, 성공 및 부분 성공)가 필요합니다.따라서 cmdlet을 사용하는 경우 더 효과적입니다.

$(command -arg1 -arg2 -ev err | Out-Host;!$err) -and 
$(command -arg1 -ev err | Out-Host;!$err)

이런 바람은 여전합니다.아마도 이런 것이 더 나을 것입니다.

function ExecuteUntilError([scriptblock[]]$Scriptblock)
{
    foreach ($sb in $scriptblock)
    {
        $prevErr = $error[0]
        . $sb
        if ($error[0] -ne $prevErr) { break }
    }
}

ExecuteUntilError {command -arg1 -arg2},{command2-arg1}

파워쉘 7 미리보기 5에 있어요.이것이 왜 알림도 설명도 없이 삭제되었는지 모르겠습니다.https://devblogs.microsoft.com/powershell/powershell-7-preview-5/ 이렇게 하면 질문이 요청한 대로 두 명령이 모두 출력됩니다.

echo 'hello' && echo 'there'
hello
there

echo 'hello' || echo 'there'
hello

여러 단계의 스크립트를 단순화하기 위해 이 || 1번 출구는 다음과 같은 을 사용합니다.

function ProceedOrExit { 
    if ($?) { echo "Proceed.." } else { echo "Script FAILED! Exiting.."; exit 1 } 
}

doThis; ProceedOrExit
doNext

# or for long doos
doThis
ProceedOrExit
doNext

업데이트: PowerShell [Core] 7.0 도입지원 - 이 답변을 참조하십시오.


Bash의 /'s컨트롤 연산자에는 Windows PowerShell과 동등한 기능이 없으므로 사용자 지정 연산자를 정의할 수 없으므로 좋은 해결 방법이 없습니다.

  • | Out-HostKeith Hill의 답변에 기반한 해결책은 정상적인 명령 출력을 콘솔(단말기)에만 전송할 수 있어 출력이 파이프라인을 통해 전송되거나 변수 또는 파일에 캡처되는 것을 방지할 수 있다는 점에서 매우 제한적입니다.

이 답변에서 배경 정보를 찾습니다.

가장 간단한 해결책은

powershell command1 && powershell command2

cmd 껍질로물론 이것은 .ps1 스크립트에서는 사용할 수 없기 때문에 그 한계가 있습니다.

조금 더 긴 길이 아래에 보입니다.

try {
  hostname
  if ($lastexitcode -eq 0) {
    ipconfig /all | findstr /i bios
  }
} catch {
  echo err
} finally {}

7.0&&그리고.||됩니다.

https://devblogs.microsoft.com/powershell/announcing-powershell-7-0/

New operators:
  Ternary operator: a ? b : c
  Pipeline chain operators: || and &&
  Null coalescing operators: ?? and ??=

언급URL : https://stackoverflow.com/questions/2251622/conditional-execution-and-in-powershell

반응형