Unk*_*007 1 powershell average batch-file execution-time
我尝试遵循 powershell-command,但随后打开了 1000 个窗口并且 powershell ISE 崩溃了。有没有办法在后台运行批处理文件 1000 次?有没有更聪明的方法来获得平均执行时间?
这是我试过的代码:
cd C:\scripts
Measure-Command {
for($i = 0;$i -lt 1000;$i++){
Start-Process -FilePath "C:\scripts\open.bat"
}
}
Run Code Online (Sandbox Code Playgroud)
Start-Process
默认情况下,在新的控制台窗口中异步运行程序。
由于您想同步运行批处理文件,因此请在同一个控制台窗口中直接调用它(因为路径是双引号的 - 尽管在这种情况下不一定必须如此 - 需要语法&
的调用运算符原因):
Measure-Command {
foreach ($i in 1..1000){
& "C:\scripts\open.bat"
}
}
Run Code Online (Sandbox Code Playgroud)
注意:丢弃正在运行的脚本块的成功输出;如果您确实想在控制台中看到它,请使用以下变体,但请注意,它会减慢处理速度:Measure-Command
Measure-Command {
& {
foreach ($i in 1..1000){
& "C:\scripts\open.bat"
}
} | Out-Host
}
Run Code Online (Sandbox Code Playgroud)
这个答案更详细地解释了为什么Start-Process
通常是调用基于控制台的程序和脚本的错误工具。
Measure-Command
是在 PowerShell 中进行性能测量的正确工具,但重要的是要注意,鉴于 PowerShell 的动态特性,此类测量远非一门精确的科学,其中涉及许多缓存和幕后按需编译。
平均多次运行通常是有意义的,尤其是在调用外部程序时;相比之下,如果PowerShell 代码重复执行且重复次数超过 16,则会发生按需编译并加速后续执行,这可能会导致结果出现偏差。
Time-Command
是一个友好的包装器Measure-Object
,可从这个 MIT 许可的 Gist 获得;它可用于简化您的测试。
# Download and define function `Time-Command` on demand (will prompt).
# To be safe, inspect the source code at the specified URL first.
if (-not (Get-Command -ea Ignore Time-Command)) {
$gistUrl = 'https://gist.github.com/mklement0/9e1f13978620b09ab2d15da5535d1b27/raw/Time-Command.ps1'
if ((Read-Host "`n====`n OK to download and define benchmark function ``Time-Command`` from Gist ${gistUrl}?`n=====`n(y/n)?").Trim() -notin 'y', 'yes') { Write-Warning 'Aborted.'; exit 2 }
Invoke-RestMethod $gistUrl | Invoke-Expression
if (-not ${function:Time-Command}) { exit 2 }
}
Write-Verbose -Verbose 'Running benchmark...'
# Omit -OutputToHost to run the commands quietly.
Time-Command -Count 1000 -OutputToHost { & "C:\scripts\open.bat" }
Run Code Online (Sandbox Code Playgroud)
请注意,虽然它Time-Command
是一个方便的包装器,甚至可以用于测量单个命令的性能,但它还允许您比较作为单独脚本块( )传递的多个命令的性能。{ ... }
归档时间: |
|
查看次数: |
61 次 |
最近记录: |