如何在PowerShell中输出一些东西

我正在batch file中运行PowerShell脚本。 该脚本获取网页并检查页面内容是否为string“OK”。

PowerShell脚本将一个错误级别返回给批处理脚本。

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

在PowerShell脚本中,如果它不是“OK”,我想从网站输出返回值,所以错误消息被包含在控制台输出中,并因此包含在状态邮件中。

我是PowerShell的新手,不确定使用哪个输出函数。 我可以看到三个:

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

什么是正确的事情来写入到Windows相当于stdout

简单地输出一些东西是PowerShell是一个美丽的东西 – 一个最大的优势。 例如,常见的Hello,World! 应用程序被简化为一行:

 "Hello, World!" 

它创build一个string对象,分配前面提到的值,并且是调用.toString()方法的命令pipe道上的最后一项,并将结果输出到STDOUT (默认情况下)。 美的东西。

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

我想在这种情况下,你将需要写输出 。

如果你有一个脚本

 Write-Output "test1"; Write-Host "test2"; "test3"; 

那么,如果你调用脚本的redirect输出,像yourscript.ps1 > out.txt ,你会在屏幕test1\ntest3\n在“out.txt”中得到test2

请注意,“test3”和Write-Output行将始终在文本中添加一行,PowerShell无法停止此操作(即使用本机命令在PowerShell中不能执行echo -n命令)。 如果你想(在Bash中有点基本和容易) echo -nfunction,那么看samthebest的答案 。

如果batch file运行PowerShell命令,则很可能会捕获写入输出命令。 我已经和系统pipe理员进行了长时间的讨论,应该把什么东西写到控制台上,哪些不应该这样做。 我们现在已经同意,脚本执行成功或死亡的唯一信息必须是Write-HostWrite-Host ),脚本作者可能需要知道的有关执行的信息(更新了哪些项目,设置了哪些字段等等写入输出)。 这样,当你提交一个脚本给系统pipe理员时,他可以轻松地runthescript.ps1 >someredirectedoutput.txt并在屏幕上看到,如果一切正常。 然后发送“someredirectedoutput.txt”给开发者。

你可以在你的场景中使用其中的任何一个,因为他们写入默认stream(输出和错误)。 如果您将输出pipe道输送到另一个命令行程序,则需要使用写入输出 ,最终将终止于写入主机 。

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

我认为以下是Echo vs. 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])" 

以上terminal输出:

 123 x of type 'Object[]' = 456 789 $x[0] = 456 $x[1] = 789 
 Write-Host "Found file - " + $File.FullName -ForegroundColor Magenta 

品红色可以是“System.ConsoleColor”枚举值之一 – 黑色,DarkBlue,DarkGreen,DarkCyan,DarkRed,DarkMagenta,DarkYellow,Gray,DarkGray,蓝色,绿色,青色,红色,洋红色,黄色,白色。

+ $File.FullName是可选的,并显示如何将一个variables放入string中。

你根本无法让PowerShell忽略那些讨厌的换行符。 没有脚本或cmdlet这样做。

当然,写主机是绝对的废话,因为你不能从它redirect/pipe道! 你只需要写你自己的:

 using System; namespace WriteToStdout { class Program { static void Main(string[] args) { if (args != null) { Console.Write(string.Join(" ", args)); } } } } 

例如

 PS C:\> writetostdout finally I can write to stdout like echo -n finally I can write to stdout like echo -nPS C:\> 

从PowerShell脚本中使用外部程序:

 cmd /c echo "Long string: $LongStr" 

在运行单独的进程方面,这是愚蠢而昂贵的,但PowerShelldevise不佳。