为什么Powershell Jobs这么慢?

ber*_*d_k 7 powershell jobs

当我在本地执行一个简单的语句

$path = 'C:\Windows\System32\WindowsPowerShell\v1.0'
gci $path
Run Code Online (Sandbox Code Playgroud)

我马上看到了回应.但是当我在本地机器上执行它时

$start = get-date
$path = 'C:\Windows\System32\WindowsPowerShell\v1.0'
$cmd = [scriptblock]::Create("gci $path")
$jnr1 = Invoke-Command -computer localhost -ScriptBlock $cmd  -asJob
Wait-Job $jnr1
Receive-job $jnr1
$end = Get-date
($end - $start).totalseconds
Run Code Online (Sandbox Code Playgroud)

我要等55秒.从我十年前的unix经验来看.我希望后台作业的运行速度几乎和前台作业一样快.

有没有办法加快PowerShell后台作业的执行?

And*_*ndi 4

这个较短的命令执行相同的操作:

Measure-Command {Start-Job -Command {gci C:\Windows\System32\WindowsPowerShell\v1.0} | Wait-Job | Receive-Job}
Run Code Online (Sandbox Code Playgroud)

在带有 PSv3 的 Win8 beta 上,对我来说快了约 3 秒,在带有 PSv2 的 WinXp 上,速度约为 15-30 秒。

PsV2 引入了后台作业。自 v2 以来,他们有时间进行优化,而 PowerShell 现在在 v3 中使用DLR,因此这可能可以解释性能差异。

它必须使用命令文本启动另一个 powershell 进程,运行命令,发回序列化结果并终止该进程。

为了弄清楚它在做什么,我在上面的命令运行时运行了 procmon,并且大部分时间 powershell.exe 都在读取网络和 COM 相关的注册表项。