【问题标题】:Powershell variable assignment vs pipelinePowershell变量分配与管道
【发布时间】:2019-02-26 18:13:13
【问题描述】:

这两个命令的根本区别是什么?

$myVar = & "notepad.exe"

& "notepad.exe" | Set-Variable "myVar"

对于第一个,命令立即返回,而无需等待 exe 终止,这不是我所期望的。

对于第二个(或任何其他带有管道的东西,例如| Out-File| Set-Content),该命令会正确等待 exe 将结果写入标准输出并终止。

【问题讨论】:

  • 你确定吗?它是一个什么样的程序?在这两种情况下,Powershell 都应该等待 exe 完成。 (刚刚再次测试以确认)。你能举一个实际可验证的例子吗?
  • 我的程序是 LabVIEW,但我观察到与例如 notepad.exe 相同($myVar = & notepad.exe 立即返回,& notepad.exe | Set-Variable "myVar" 仅在我关闭窗口时返回)。
  • 到目前为止我只能说,不同的是,在第二个版本中,程序是挂在管道上的。这将给出相同的行为:$myvar = & notepad.exe|%{$_} 我很清楚为什么会这样。我认为实际的 UI 应用程序与控制台是不同的(比较 ping.exe:powershell 在两种情况下都等待)
  • 有关信息,我的程序是LabVIEW,它也是一个UI应用程序。

标签: powershell


【解决方案1】:

管道只不过是从第一个集合中获取输出并将其作为输入传递给第二个集合。管道就像一系列连接的管道段。沿管道移动的项目必须通过每个段。

在您的情况下,Powershell 实际上在这两种情况下都在等待。但是如果您使用Measure-Command,则执行时间会有所不同,在$myVar = & "C:\path to\program.exe" $argument的情况下会更好

【讨论】:

  • 如果我的 exe 需要 10 分钟才能运行(实际上是这样),第一个命令将立即终止,第二个将在 10 分钟后终止。
  • 使用 Measure-Command 通过管道再进行一次比较。这将帮助您执行方法。但从技术上讲,它只是正确的。
猜你喜欢
  • 2017-08-15
  • 2016-06-26
  • 2017-07-29
  • 2017-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-09
相关资源
最近更新 更多