【发布时间】:2017-02-09 13:41:43
【问题描述】:
我试图测量一些在 PowerShell 中写入文件的方法。毫无疑问,但我不明白为什么下面的第一个 Measure-Command 语句比第二个语句需要更长的时间来执行。
它们是相同的,但在第二个中我编写了一个脚本块发送到Invoke-Command,在第一个中我只运行命令。
我能找到的关于Invoke-Command速度的所有信息都是关于远程处理的。
这个块大约需要 4 秒:
Measure-Command {
$stream = [System.IO.StreamWriter] "$PSScriptRoot\t.txt"
$i = 0
while ($i -le 1000000) {
$stream.WriteLine("This is the line number: $i")
$i++
}
$stream.Close()
} # takes 4 sec
下面这段代码完全相同,但写在传递给Invoke-Command的脚本块中大约需要1秒:
Measure-Command {
$cmdtest = {
$stream = [System.IO.StreamWriter] "$PSScriptRoot\t2.txt"
$i = 0
while ($i -le 1000000) {
$stream.WriteLine("This is the line number: $i")
$i++
}
$stream.Close()
}
Invoke-Command -ScriptBlock $cmdtest
} # Takes 1 second
这怎么可能?
【问题讨论】:
-
在这种特殊情况下可能是因为 icm doesn't create a steppable pipeline。无论如何,这是一个很棒的发现!
-
本,@wOxxOm:哎呀!我的回答最初的框架并不完全正确——这个问题与可步进的管道无关。这只是关于点源与在子范围内运行 - 请参阅我的更新。
-
确实,我什至偶尔会在繁重的函数中使用重新分配给同名变量以使其成为本地变量。
标签: powershell-4.0 invoke-command