PowerShell脚本块内的命令执行顺序
起初我对PowerShell ScriptBlock很兴奋,但最近我对它在块内的执行顺序感到困惑。例如:PowerShell脚本块内的命令执行顺序,powershell,scriptblock,Powershell,Scriptblock,起初我对PowerShell ScriptBlock很兴奋,但最近我对它在块内的执行顺序感到困惑。例如: $test_block = { write-host "show 1" ps write-host "show 2" Get-Date } 调用$test_block.Invoke的输出: show 1 show 2 <result of command 'ps'> <result of command 'get-date'> 输出内容的命令是否首
$test_block = {
write-host "show 1"
ps
write-host "show 2"
Get-Date
}
调用$test_block.Invoke的输出:
show 1
show 2
<result of command 'ps'>
<result of command 'get-date'>
输出内容的命令是否首先运行?这种行为是因为没有将输出放在管道上。其他命令放置在管道上,因此在函数调用返回之前不会输出到屏幕
要获得我相信您期望的行为,请改用,所有命令的结果将在管道中返回
$test_block = {
write-output "show 1"
ps
write-output "show 2"
Get-Date
}
$test_block.Invoke()
这种行为是因为没有将输出放到管道上。其他命令放置在管道上,因此在函数调用返回之前不会输出到屏幕
要获得我相信您期望的行为,请改用,所有命令的结果将在管道中返回
$test_block = {
write-output "show 1"
ps
write-output "show 2"
Get-Date
}
$test_block.Invoke()
补充:
实际上,Write Host用于直接写入主机,主机是基于控制台窗口的PowerShell会话中的控制台终端。
也就是说,Write Host有意绕过PowerShell的成功输出流,命令和表达式会将数据隐式发送到该流
Write Output是写入成功输出流的cmdlet,但很少需要显式使用它;您可以按原样使用show 1和show 2
写主机用于创建用户界面,打印彩色消息以通知用户,而不是输出数据
有关详细信息,请参见的底部部分
# OK: Output ordering as expected:
# Get-Item outputs a System.IO.DirectoryInfo instance for which
# format data is predefined.
PS> Write-Host '------- 1'; Get-Item /; Write-Host '------- 2'
------- 1
Directory:
Mode LastWriteTime Length Name
---- ------------- ------ ----
d--hs- 12/5/2019 3:34 PM C:\
------- 2
脚本块{…}通常由调用运算符&调用,而不是通过它们的.Invoke方法调用
.Invoke确实首先收集所有成功的输出流数据,然后在从方法调用返回时输出它们,而写主机调用是立即的
但是,此行为不适用于使用&:
使用&-调用以及按顺序直接调用命令也会立即输出成功流对象,因此您将获得预期的输出顺序
您可以通过管道将无序命令传输到out Host来解决此问题,但请注意,这会阻止对其输出进行进一步的编程处理:
请参阅,以获取一种潜在但次优的解决方案,该解决方案不需要主机,而是将for显示字符串发送到成功输出流,通过嵌入式VT虚拟终端转义序列实现着色。补充:
实际上,Write Host用于直接写入主机,主机是基于控制台窗口的PowerShell会话中的控制台终端。
也就是说,Write Host有意绕过PowerShell的成功输出流,命令和表达式会将数据隐式发送到该流
Write Output是写入成功输出流的cmdlet,但很少需要显式使用它;您可以按原样使用show 1和show 2
写主机用于创建用户界面,打印彩色消息以通知用户,而不是输出数据
有关详细信息,请参见的底部部分
# OK: Output ordering as expected:
# Get-Item outputs a System.IO.DirectoryInfo instance for which
# format data is predefined.
PS> Write-Host '------- 1'; Get-Item /; Write-Host '------- 2'
------- 1
Directory:
Mode LastWriteTime Length Name
---- ------------- ------ ----
d--hs- 12/5/2019 3:34 PM C:\
------- 2
脚本块{…}通常由调用运算符&调用,而不是通过它们的.Invoke方法调用
.Invoke确实首先收集所有成功的输出流数据,然后在从方法调用返回时输出它们,而写主机调用是立即的
但是,此行为不适用于使用&:
使用&-调用以及按顺序直接调用命令也会立即输出成功流对象,因此您将获得预期的输出顺序
您可以通过管道将无序命令传输到out Host来解决此问题,但请注意,这会阻止对其输出进行进一步的编程处理:
请参阅,以获取一种潜在但次优的解决方案,该解决方案不需要主机,而是将for显示字符串发送到成功输出流,通过嵌入式VT虚拟终端转义序列实现着色
# Using Out-Host fixes the output-ordering problem, but prints
# the data to the host (display) only.
PS> Write-Host '------- 1'; Get-Item / | Select-Object FullName | Out-Host; Write-Host '------- 2'
------- 1
FullName
--------
/
------- 2