如何在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 -n
function,那么看samthebest的答案 。
如果batch file运行PowerShell命令,则很可能会捕获写入输出命令。 我已经和系统pipe理员进行了长时间的讨论,应该把什么东西写到控制台上,哪些不应该这样做。 我们现在已经同意,脚本执行成功或死亡的唯一信息必须是Write-Host
( Write-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不佳。