使用PowerShell调用排序.exe自动传参,循环测平均耗时失败求助
问题排查与修正方案
原代码的核心问题
$wshell未定义且使用方式错误:直接写$wshell.SendKeys('~')但未创建WScript.Shell对象,且SendKeys不能作为exe的命令行参数传递,完全不符合语法。- 时间计算逻辑错误:将日期转成字符串后做减法,字符串相减无法得到有效时间差,必须用
Get-Date返回的DateTime对象计算时间间隔。 - 循环次数少一次:
$i -lt $cycles会让循环从1执行到49,只跑49次,达不到预期的50次。 - exe输入传递方式错误:目标exe从标准输入读取数组,用SendKeys模拟回车既不可靠又没必要,应该直接通过管道传递输入。
- 无效参数
-Wait ??:属于语法错误,PowerShell直接调用exe会同步等待执行完成,不需要这种写法。
修正后的代码
$asm_average = 0 $cycles = 50 # 修正循环条件,确保执行50次 for ($i = 1; $i -le $cycles; $i++) { Write-Host "第 $i 次测试:" # 生成30个1-100的随机数数组 $randomArray = Get-Random -InputObject (1..100) -Count 30 $inputString = $randomArray -join ' ' # 记录开始时间(保留DateTime对象,不转字符串) $startTime = Get-Date # 将数组字符串通过管道传给exe,自动完成输入 $inputString | D:\lr\projects\helloworld\pp2.exe # 记录结束时间 $endTime = Get-Date # 计算耗时(以毫秒为单位,可按需改用TotalSeconds等) $elapsedMs = ($endTime - $startTime).TotalMilliseconds Write-Host "本次耗时:$elapsedMs 毫秒`n" $asm_average += $elapsedMs } # 计算并输出平均时间 $asm_average = $asm_average / $cycles Write-Host "平均运行时间:$asm_average 毫秒"
关键修正说明
- 输入传递:用
$inputString | pp2.exe将数组字符串直接通过标准输入传给exe,彻底实现输入自动化,无需模拟按键。 - 时间计算:通过
Get-Date获取DateTime对象,减法得到TimeSpan对象后,用TotalMilliseconds获取精确耗时。 - 循环次数:将
$i -lt $cycles改为$i -le $cycles,保证循环执行满50次。 - 冗余代码清理:删除了错误的
$wshell.SendKeys('~')和-Wait ??,简化调用逻辑。
内容的提问来源于stack exchange,提问作者mashiro ginca
相关产品推荐
相关产品推荐

