Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PowerShell脚本块内的命令执行顺序_Powershell_Scriptblock - Fatal编程技术网

PowerShell脚本块内的命令执行顺序

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'> 输出内容的命令是否首

起初我对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-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