2016-09-22 53 views
2

出於有趣的原因,我編寫了一個批處理文件,輸入100個隨機輸入的大寫/小寫字母,無論我單擊它。由於這個過程非常緩慢,我決定從命令行啓動它,使用簡單的for循環在更短的時間內獲得更多字符: for /L %m in (1,1,3) do (start bat.bat)在文件所在的文件夾中啓動shell。並行運行相同批處理文件的行爲

Beeing好奇,如果我真的有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)); 

回答

2

我想這是在自己的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函數的功能在某種程度上被打破了。