如何在PowerShell中输出内容

Pek*_*ica 197 windows powershell

我正在批处理文件中运行PowerShell脚本.该脚本获取一个网页并检查该页面的内容是否为字符串"OK".

PowerShell脚本向批处理脚本返回错误级别.

批处理脚本由ScriptFTP执行,ScriptFTP是一个FTP自动化程序.如果发生错误,我可以让ScriptFTP通过电子邮件将完整的控制台输出发送给管理员.

在PowerShell脚本中,如果它不是"OK",我想从网站输出返回值,因此错误消息包含在控制台输出中,因此也包含在状态邮件中.

我是PowerShell的新手,不知道要使用哪个输出函数.我可以看到三个:

  • 写主机
  • 写输出
  • 写入错误

用什么来写Windows等价的东西是正确的stdout

Goy*_*uix 189

只需输出一些东西,PowerShell就是一件美丽的东西 - 也是它最大的优势之一.例如,常见的Hello,World!应用程序减少到一行:

"Hello, World!"
Run Code Online (Sandbox Code Playgroud)

它创建一个字符串对象,分配上述值,并作为命令管道上的最后一项,它调用该.toString()方法并将结果输出到STDOUT(默认情况下).一件美丽的事.

其他Write-*命令特定于将文本输出到其关联的流,并且具有它们的位置.

  • 事实并非如此.它是一个字符串文字表达式,也是其管道中唯一的东西.因此它相当于"你好,世界!" | OUT-Host`.另一方面,"Out-Host"将对象发送到PowerShell主机进行显示,其实现取决于主机.控制台主机确实将它们发送到标准输出句柄(沿途经过`Out-Default`).但是,PowerShell ISE会在其输出窗格中显示它们,而其他主机可能会完全执行其他操作. (8认同)
  • 对象也不会盲目地转换为字符串,而是通过_formatter_来决定如何处理它们.这就是为什么你看到`Get-ChildItem`的输出以表格形式出现,例如,具有许多属性(例如WMI)的结果默认为`Format-List`. (5认同)

nai*_*sts 117

我想在这种情况下你需要写输出.

如果你有一个类似的脚本

Write-Output "test1";
Write-Host "test2";
"test3";
Run Code Online (Sandbox Code Playgroud)

然后,如果您使用重定向输出调用脚本,类似于yourscript.ps1 > out.txt,您将在"out.txt" test2屏幕上显示test1\ntest3\n.

请注意,"test3"和Write-Output行将始终在文本中添加一个新行,并且PowerShell无法停止此操作(即,echo -n使用本机命令在PowerShell中无法实现).如果你想要(有点基本和简单的Bash)功能,echo -n那么请看samthebest的答案.

如果批处理文件运行PowerShell命令,则很可能会捕获Write-Output命令.我与系统管理员就应该写入控制台的内容以及不应该写的内容进行了"长时间的讨论".我们现在已经同意,如果脚本执行成功或死亡的唯一信息必须被Write-Host编辑,并且脚本作者的所有内容可能需要知道执行(更新了哪些项目,设置了哪些字段等等)写输出.这样,当您向系统管理员提交脚本时runthescript.ps1 >someredirectedoutput.txt,如果一切正常,他可以轻松地在屏幕上看到.然后将"someredirectedoutput.txt"发送回开发人员.


use*_*679 8

我认为以下是Echo与Write-Host的良好展示.注意test()实际上如何返回一个int数组,而不是一个int,因为很容易让人相信.

function test {
    Write-Host 123
    echo 456 # AKA 'Write-Output'
    return 789
}

$x = test

Write-Host "x of type '$($x.GetType().name)' = $x"

Write-Host "`$x[0] = $($x[0])"
Write-Host "`$x[1] = $($x[1])"
Run Code Online (Sandbox Code Playgroud)

上面的终端输出:

123
x of type 'Object[]' = 456 789
$x[0] = 456
$x[1] = 789
Run Code Online (Sandbox Code Playgroud)


Gra*_*rdx 7

您可以在场景中使用其中任何一个,因为它们会写入默认流(输出和错误).如果您将输出传递给另一个命令行开关,则需要使用Write-Output,它最终会在Write-Host中终止.

本文介绍了不同的输出选项:PowerShell O用于输出


mkl*_*nt0 6

什么是写入 Windows 等效标准输出的正确方法?

效果,但是很不幸的是,无论是Windows PowerShell和PowerShell核心为V7.0,送所有的6(!)的输出流标准输出时,称为从外面,通过PowerShell的CLI

  • 有关问题行为的讨论,请参阅此 GitHub 问题,该问题可能不会得到修复,以保持向后兼容性。

  • 实际上,这意味着您将输出发送到的任何 PowerShell 流都将被外部调用者视为stdout输出:

    • 例如,如果您从 运行以下命令cmd.exe,您将看不到任何输出,因为 stdout 重定向NUL同样适用于所有 PowerShell 流:

      • C:\>powershell -noprofile -command "Write-Error error!" >NUL
    • 但是 - 奇怪的是 -如果您重定向 stderr,PowerShell确实将其错误流发送到 stderr,以便2>可以有选择地捕获错误流输出;以下输出只是'hi'- 成功流输出 - 同时捕获文件中的错误流输出err.txt

      • C:\>powershell -noprofile -command "'hi'; Write-Error error!" 2>err.txt

理想的行为是:

  • 将 PowerShell 的成功输出流(数字1)发送到stdout

  • 从发送输出所有其他流stderr的给定的,这是唯一的选择,那之间仅处理2输出流存在-标准输出(标准输出)用于数据,和stderr(标准误差)的错误消息所有其它类型的消息-例如作为状态信息 - 这不是data

  • 建议在您的代码中进行这种区分,即使它目前没有受到尊重


PowerShell 中

  • Write-Host用于显示输出,并绕过成功输出流-如这样,其输出既不能(直接地)捕获在一个变量也不抑制也不重定向。

    • 它的初衷只是创建用户反馈并创建简单的、基于控制台的用户界面(彩色输出)。

    • 由于被捕获或重定向现有无力,制成的PowerShell版本5Write-Host写入到新引入的信息流(数6),这样以来则能够捕获和重定向Write-Host输出。

  • Write-Error用于非终止错误写入错误流(数字2);从概念上讲,错误流相当于 stderr。

  • Write-Output写入成功 [output] 流(number 1),这在概念上等同于 stdout;它是数据(结果)写入的流。

    • 但是,由于 PowerShell 的隐式输出功能,很少需要显式使用Write-Output
      • 任何未明确捕获、抑制或重定向的命令或表达式的输出都会自动发送到成功流;例如,Write-Output "Honey, I'm $HOME""Honey, I'm $HOME"是等价的,后者不仅更简洁,而且速度更快。
      • 有关更多信息,请参阅此答案