我可以在powershell脚本中编写警告,但结尾不带换行符吗?

我可以在powershell脚本中编写警告,但结尾不带换行符吗?,powershell,powershell-7.0,Powershell,Powershell 7.0,我想在PowerShell中打印一条警告作为提示,然后在同一行上阅读答案。问题在于,Write Warning在消息末尾打印一个换行符,而另一个选项,Read Host-Prompt不会将提示打印到警告流中(或以黄色打印)。我看过编写警告-警告操作查询,但我认为这有点冗长,并且提供了我不想要的选项 我所做的最好的事情是: $warningMsg= "Something is wrong. Do you want to continue anyway Y/N? [Y]:"

我想在PowerShell中打印一条警告作为提示,然后在同一行上阅读答案。问题在于,
Write Warning
在消息末尾打印一个换行符,而另一个选项,
Read Host-Prompt
不会将提示打印到警告流中(或以黄色打印)。我看过
编写警告-警告操作查询
,但我认为这有点冗长,并且提供了我不想要的选项

我所做的最好的事情是:

  $warningMsg= "Something is wrong. Do you want to continue anyway Y/N? [Y]:"
  Write-Host -ForegroundColor yellow -NoNewline $warningMsg
  $cont = Read-Host

这很好用——打印黄色提示,然后在同一行上读取输入——但是我想知道我看到的反对使用
Write Host
的警告,如果找到一种不使用换行符打印到警告流的方法更合适的话。有办法吗?我注意到,
Write Host
似乎是写入信息流的包装器,但我看不到没有新行(
[Console]::Warning.WriteLine()
不存在)就可以写入警告的任何方法。

您无法使用
Write Warning
执行您想要的操作

因此,我将回答您的其他问题。
Write Host
非常适合在PowerShell 5+脚本中使用

如果您查看那些反对使用它的文章,您会注意到绝大多数(如果不是全部的话)都是在PowerShell 5推出之前编写的

如今,
Write Host
写信息的包装器

委员会确认:

从Windows PowerShell 5.0开始,
Write Host
写入信息
这允许您使用
写入主机
将输出发送到 信息流。这可以捕获或抑制 使用
写入主机写入的数据
,同时向后保留 兼容性

$InformationPreference
首选项变量和
-InformationAction
公共参数不影响
写入主机
消息。例外 这条规则是
-信息操作忽略
,有效抑制
写入主机
输出

使用
Write Host
和/或
Write information
写入信息流不会对输出字符串产生问题

Stream #    Description          Introduced in
1           Success Stream       PowerShell 2.0
2           Error Stream         PowerShell 2.0
3           Warning Stream       PowerShell 3.0
4           Verbose Stream       PowerShell 3.0
5           Debug Stream         PowerShell 3.0
6           Information Stream   PowerShell 5.0
*           All Streams          PowerShell 3.0
奖金

如果您通过
-InformationAction
参数使用高级函数,还可以控制信息流的可见性,前提是您还将给定的参数值绑定到函数中的
Write Host
语句

例如,如果您希望在默认情况下禁用信息流,除非另有要求:

function Get-Stuff {
     [CmdletBinding()]
     param ()

     if (!$PSBoundParameters.ContainsKey('InformationAction')) {
        $InformationPreference = 'Ignore'
     }
     Write-Host 'This is the stuff'  -InformationAction $InformationPreference -ForegroundColor Green
}

# Hidden by default
Get-Stuff
# Force it to show
Get-Stuff -InformationAction Continue

注意

虽然从技术上讲,不可能使用
写入警告-NoNewLine
,但您可以研究如何操作光标位置并将其重置到前一行的末尾,因此也可以这样做

然而,我在这方面的经验有限,而且我对这个问题的观察是,您可能最终不得不创建异常以符合某些控制台环境的限制。在我看来,这有点过分了

其他参考资料

有关写入主机的警告是。。。经常夸大其词。[咧嘴笑]如果你想在屏幕上写字,你想要颜色,你愿意放弃干净地禁用这种书写的能力。。。那么
Write-Host
就是正确的使用方法。随着PS5的推出,Write-Host的“邪恶”消失了。我知道在那之前它是有问题的,但是现在,它确实在信息流中写下了(更多细节见答案)@Lee_Dailey我对“放弃”这个事实很好奇,所以我检查了一下。您仍然可以通过
-InformationAction
参数禁用该写入(请参阅我的答案[grin back]中的奖金部分)@SagePourpre-ah!谢谢[咧嘴笑]。。。我已经忘记了
-InformationAction
如何更改
编写主机
。。。[脸红]如果我能将信息重定向到警告,也许我能做到,但这似乎还不可能。