나는 이것이 잘못된 방향으로 접근하고 있다고 생각합니다. Write-Host
을 사용하지 않고 빨간색 전경색을 강요하는 대신 터미널에 빨간색으로 표시되는 객체를 출력해야하지만 파일에 쓸 때 일반 텍스트처럼 보입니다.
이미 개체가 있습니다. 형식이 System.Management.Automation.ErrorRecord
이면 파이프 라인 끝 부분에 도달해도 빨간색으로 표시되지만 파일에는 쓸 수 있습니다. 불행하게도 보통 사용자의 목적에 따라 CategoryId
및 FullyQualifiedErrorId
필드 형식을 갖지만 원시 개체 명령으로 오류 개체를 만든 경우에는 수행되지 않습니다. 우리가 할 수있는 가짜 같은 그 행동 :
이제
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
을 다시 정의했는지 여부를 알 수있는 방법이 없습니다.