我怎样才能运行一个批处理文件大约 1000 次,然后我想要平均执行时间作为输出。这可能吗?

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)

mkl*_*nt0 5

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是一个方便的包装器,甚至可以用于测量单个命令的性能,但它还允许您比较作为单独脚本块( )传递的多个命令的性能。{ ... }