bestsource

IDE를 사용할 때 Powershell에서 타사 실행 파일을 호출할 때 오류 발생

bestsource 2023. 4. 29. 09:32
반응형

IDE를 사용할 때 Powershell에서 타사 실행 파일을 호출할 때 오류 발생

du.exe(원래 Sysinternals의 디스크 사용)를 사용하여 디렉터리 크기를 계산하는 PowerShell 스크립트가 있습니다.

내가 뛰면,du c:\Backup콘솔에서는 예상대로 작동하지만 ISE 또는 PowerGui에서 실행되는 동일한 코드 라인이 예상 결과와 오류를 제공합니다.

+ du <<<<  c:\backup
+ CategoryInfo          : NotSpecified: (:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError

왜 그런 것일까요?이 오류를 방지하려면 어떻게 해야 합니까?저는 호출-표현을 시도했습니다.&하지만 가지 마.

도와 주셔서 감사해요.

이를 억제하는 또 다른 방법은NativeCommandError출력은 파이프라인의 객체를 다음 답변 하단에 설명된 문자열로 변환합니다.

du c:\Backup 2>&1 | %{ "$_" }

이 문제를 방지하려면 stderr을 null로 리디렉션할 수 있습니다. 예:

du 2> $null

기본적으로 콘솔 호스트와 ISE(원격뿐만 아니라)는 stderr 스트림을 다르게 처리합니다.콘솔 호스트에서 PowerShell이 edit.com 과 같은 애플리케이션을 지원하여 컬러 출력 및 오류를 화면에 기록하는 다른 애플리케이션과 함께 작동하는 것이 중요했습니다.콘솔 호스트에서 I/O 스트림이 리디렉션되지 않으면 PowerShell은 기본 EXE에 직접 쓸 콘솔 핸들을 제공합니다.그러면 PowerShell이 오류가 기록된 것을 확인할 수 없으므로 $error를 통해 또는 PowerShell의 stderr 스트림에 쓰기를 통해 오류를 보고할 수 없습니다.

ISE 및 원격은 이 시나리오를 지원할 필요가 없으므로 stderr에서 오류를 확인한 후 오류를 기록하고 $error를 업데이트합니다.

저는 최근에 같은 문제에 직면하고 있지만, stdout으로 stderr 출력을 받고 싶습니다.다음과 같은 작업이 가능할 것으로 생각됩니다.

    & du 2>&1

그러나 PowerShell은 리디렉션을 해석하여 'du'가 완료된 후 처리합니다.찾은 해결 방법은 cmd.exe /c:를 사용하여 호출하는 것입니다.

    & cmd /c 'du 2>&1'

이전 FIX는 오류를 리디렉션하지만 사용자 이름이나 암호가 좋지 않거나 통합 인증을 사용하는 경우 액세스 권한이 없는 경우 실제 오류를 잃을 수 있습니다.

따라서 오류 처리를 구현하고 pexec에서 제기한 특정 오류(하나가 아님)를 우회하는 방법이 있습니다.

try {
    whoami # powershell commands
}
catch [System.Management.Automation.RemoteException] {
    if ($_.TargetObject -like "Connecting to *" -and $_.CategoryInfo.Category -eq "NotSpecified" -and $_.FullyQualifiedErrorId -eq "NativeCommandError" -and $_.InvocationInfo.MyCommand.Name -like "psexec*.exe") {
        $error.Remove[$Error[0]]
    }
    else {
        Throw
    }
}        
catch {
    throw
}

많은 머리카락을 뽑아낸 후, 저는 실제로 이러한 오류가 "Windows PowerShell ISE"에서 .ps1 파일을 실행할 때만 발생한다는 것을 깨달았습니다.

명령줄에서 동일한 .ps1 스크립트를 실행했을 때 오류가 발생하지 않았습니다.

powershell.exe .\MikesScript.ps1

PowerShell 스크립트의 맨 위에 이 스크립트를 작성하면 이 문제가 해결되고 모든 오류 명령의 전체 동작에 영향을 미치지 않습니다.

#prepare powershell for docker-compose commands
        if((select-string -Path $profile -Pattern "Set-Alias docker-compose 'docker-compose.cmd'") -eq $null ){
           Add-Content -Path $profile -Value "Set-Alias docker-compose 'docker-compose.cmd'"}
$str = "@echo off
        docker-compose.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 2>&1"
        if ((Get-Content "C:\Windows\System32\docker-compose.cmd" -ErrorAction Ignore) -ne $str){
            $str.Trim() | Out-File "C:\Windows\System32\docker-compose.cmd" -Encoding ascii}

언급URL : https://stackoverflow.com/questions/2095088/error-when-calling-3rd-party-executable-from-powershell-when-using-an-ide

반응형