gpt4 book ai didi

powershell - powershell 是否让您检测输出是否被定向到屏幕,还是通过管道传输到变量/文件?

转载 作者:行者123 更新时间:2023-12-03 10:05:32 27 4
gpt4 key购买 nike

我知道这种感觉就像在管道上的“错误方向”上移动状态,但在某些情况下这可能很方便。

这个代码片段可能吗?

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

哪里 Directed-To-Screen如果当前代码/脚本通过管道传输到变量或文件等,将返回 $false (我知道 [Console]::ForegroundColor\ $host.UI.RawUI.ForegroundColor 可用于在某些控制台中为写入输出着色)。

如果要打印在屏幕上,实际上可以做很多事情来改进格式,而实用功能的管道输出可能应该结构化,以便可以使用各个字段。能够区分它们可能非常有用。 (没有办法让 PSObject 覆盖其 ToString 格式,以便在打印到屏幕时看起来很漂亮,是吗?)

甚至可能无法检测到它是否出现在屏幕上。任何人都可以确认吗?

最佳答案

我认为你以错误的方式接近这个。而不是使用 Write-Host并强制使用红色前景色,您应该输出一个在终端上显示为红色但在写入文件时看起来像纯文本的对象。

已经有一个对象可以做到这一点:任何类型的对象 System.Management.Automation.ErrorRecord如果到达管道的末尾,但可以写入文件,则将显示为红色。不幸的是,出于您的目的,它通常使用 CategoryId 格式化和 FullyQualifiedErrorId字段,但如果错误对象是由 native 命令创建的,则不会这样做。我们可以像这样伪造这种行为:

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!"

如果它到达主机,它将显示为红色,但如果它以文件结尾,则仅显示为纯文本。

注意它是 writeErrorStream对象上的属性实际上使其显示为红色,因此可以通过添加该属性使其他对象也显示为红色。例如
$out = ls
$out | Add-Member -NotePropertyName writeErrorStream -NotePropertyValue $True
$out

会给你一个在控制台上显示为红色的目录列表,或者如果你愿意设置 WriteWarningStream橙色文本的属性。

至于你的其余问题,我很确定没有办法知道输出最终会在哪里。有一个隐含的 | Out-Default在最外层管道的末端。 Out-Default格式化对象并将它们发送到控制台,但是无法判断是否有任何对象到达该最终命令,或者它们是否到达了您是否已重新定义 Out-Default做一些完全不同的事情。

关于powershell - powershell 是否让您检测输出是否被定向到屏幕,还是通过管道传输到变量/文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26884087/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com