2014-11-12 2 views
3

나는이 종류의 파이프 라인에서 "잘못된 방향"으로 상태를 움직이는 것처럼 느낀다는 것을 알고 있지만, 이것이 편리 할 수있는 몇 가지 상황이 있습니다.출력이 화면으로 보내지는지, 변수/파일에 파이프되어 있는지를 powershell이 ​​감지 할 수 있습니까?

이 코드 스 니펫이 가능합니까? 현재 코드/스크립트가 변수 나 파일 등으로 파이프되는 경우 Directed-To-Screen은 $ 거짓을 반환

if (Directed-To-Screen) { 
    Write-Host "Error!" -ForegroundColor Red 
} else { 
    Write-Output "Error!" 
}  

은 (내가 $host.UI.RawUI.ForegroundColor \ [Console]::ForegroundColor 일부 콘솔에 컬러 쓰기 출력에 사용할 수 있습니다 알고있다).

화면에 인쇄하려면 서식을 개선하는 것이 실제로 가능하지만 유틸리티 기능의 파이프 출력은 개별 필드를 사용할 수 있도록 구성해야합니다. 그들을 구분할 수 있다는 것은 꽤 유용 할 수 있습니다. (PSObject가 ToString 포맷을 오버라이드하여 화면에 출력 될 때 꽤 아름답게 보이도록 만드는 방법은 없습니다.)

화면에서 나오는지 여부를 감지하지 못할 수도 있습니다 아닙니다. 누구든지 어느 쪽이든을 확인할 수 있습니까?

답변

3

나는 이것이 잘못된 방향으로 접근하고 있다고 생각합니다. Write-Host을 사용하지 않고 빨간색 전경색을 강요하는 대신 터미널에 빨간색으로 표시되는 객체를 출력해야하지만 파일에 쓸 때 일반 텍스트처럼 보입니다.

이미 개체가 있습니다. 형식이 System.Management.Automation.ErrorRecord이면 파이프 라인 끝 부분에 도달해도 빨간색으로 표시되지만 파일에는 쓸 수 있습니다. 불행하게도 보통 사용자의 목적에 따라 CategoryIdFullyQualifiedErrorId 필드 형식을 갖지만 원시 개체 명령으로 오류 개체를 만든 경우에는 수행되지 않습니다. 우리가 할 수있는 가짜 같은 그 행동 :

이제
function Write-RedText 
{ 
    [CmdletBinding()] 
    [OutputType([int])] 
    Param 
    (
     [Parameter(Mandatory=$true, 
        ValueFromPipelineByPropertyName=$true, 
        Position=0)] 
     $Text 
    ) 

    Begin 
    { 
    } 
    Process 
    { 
     foreach ($s in $Text) 
     { 
      #Wr$o = (Write-Error $s -ErrorId NativeCommandErrorMessage -TargetObject $None) 2>&1 
      $o = new-object -TypeName "System.Management.Automation.ErrorRecord" -ArgumentList ($s, "NativeCommandErrorMessage", [System.Management.Automation.ErrorCategory]::FromStdErr, "c") 
      $o | Add-Member -NotePropertyName writeErrorStream -NotePropertyValue $True 
      Write-Output $o 
     } 
    } 
    End 
    { 
    } 
} 

당신은 다만 할 수 있습니다

Write-RedText "Error!" 

하고 호스트에 도달하지만에 끝나는 경우 그냥 일반 텍스트로 표시되는 경우는 빨간색으로 표시됩니다 파일.

N.B. 객체의 writeErrorStream 속성은 실제로 빨간색으로 표시되므로 해당 속성을 추가하면 다른 객체도 빨간색으로 표시 될 수 있습니다. 예 : 당신은 오렌지 텍스트의 WriteWarningStream 속성을 설정 선호하는 경우

$out = ls 
$out | Add-Member -NotePropertyName writeErrorStream -NotePropertyValue $True 
$out 

당신에게 콘솔에 빨간색 디렉토리 목록을 제공하거나합니다.

질문의 나머지 부분에 관해서는 출력이 어디로 끝날지를 알 수있는 방법이 없다고 확신합니다. 가장 바깥 쪽 파이프 라인 끝에 암시적인 | Out-Default이 있습니다. Out-Default은 개체를 포맷하고 콘솔로 보냅니다. 그러나 어떤 개체가 해당 최종 명령에 도달하는지 또는 완전히 다른 작업을 수행하기 위해 Out-Default을 다시 정의했는지 여부를 알 수있는 방법이 없습니다.