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
'bestsource' 카테고리의 다른 글
찾기: -exec 인수 누락 (0) | 2023.04.29 |
---|---|
Bash 스크립트 내에서 문자열을 명령으로 실행 (0) | 2023.04.29 |
SQL Server + SQL Server 인증 + 오류에 로그인할 수 없음: 18456 (0) | 2023.04.29 |
배포된 Heroku 앱에서 파일 및 파일 구조를 보는 방법 (0) | 2023.04.29 |
Eclipse : 리소스를 필터링하는 동안 오류가 발생했습니다. (0) | 2023.04.29 |