【问题标题】:Behaviour of parallel running same batch files并行运行相同批处理文件的行为
【发布时间】:2016-09-22 14:07:23
【问题描述】:

出于有趣的原因,我编写了一个批处理文件,在我点击的任何位置输入 100 个随机的大写/小写字母。由于这变得很慢,我决定从命令行启动它,用一个简单的 for 循环在更短的时间内获得更多字符: for /L %m in (1,1,3) do (start bat.bat) 在文件所在的文件夹中启动 shell。

好奇我是否真的得到了 300 个字符,我去了this website,它实时显示了书面字符并得出了一个有趣的观察结果:我只得到了 293 个字母(+- 5 个左右),而不是预期的 300 个。我认为这是因为并行运行的进程。您甚至可以看到写作以 3 个字符的块开始,然后突然缺少一两个字符,并且在整个脚本持续时间中持续。

现在的问题是:同一个批处理文件的并行运行会影响彼此的进程吗?
下面是文件的代码(是的,我知道它可能做得更短更高效):

@if (@CodeSection == @Batch) @then
@echo off
Setlocal EnableDelayedExpansion

timeout /t 3
set SendKeys=CScript //nologo //E:JScript "%~f0"
for /L %%G in (1,1,100) do (
set /a grkl=!random! %%2
if "x!grkl!"=="x0" (
!SendKeys! "z"
) ELSE (
!SendKeys! "Z"
)
)
exit
@end
// JScript section
var WshShell = WScript.CreateObject("WScript.Shell");
WshShell.SendKeys(WScript.Arguments(0));

【问题讨论】:

    标签: batch-file for-loop parallel-processing


    【解决方案1】:

    我想这是 SendKeys 本身的错误。

    我将您的代码简化为

    @if (@CodeSection == @Batch) @then
    @echo off
    Setlocal EnableDelayedExpansion
    
    ping localhost -n 4 > nul
    set SendKeys=CScript //nologo //E:JScript "%~f0"
    for /L %%G in (1,1,100) do (
        !SendKeys! "%1"
    )
    exit
    @end
    // JScript section
    var WshShell = WScript.CreateObject("WScript.Shell");
    WshShell.SendKeys(WScript.Arguments(0));
    

    对于测试本身,我使用

    (for /L %n in (1 1 2) do ( start /b geist.bat %n) ) & set /p var=
    

    这很完美,它可以输出 200 个字符。
    但是如果你将 geist.bat %n 更改为像 geist.bat 1 这样的固定值,我得到的字符少于 200 个。
    如果我把它改成geist.bat Z,我得到了Z,还有小写的z字符!
    即使我在WshShell.SendKeys("P"); 中使用固定字符串,它也会失败

    如果我只使用for /L %n in (1 1 1) 的一个线程,一切都会再次完美。

    所以我的结论是 SendKey 功能在某种程度上被破坏了。

    【讨论】:

      猜你喜欢
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-12
      • 2013-06-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多