批处理文件:打字机效果

Giu*_*lli 3 cmd batch-file

我刚刚得到了一些代码来实现这种效果,但我需要让它更快地输入,就像每半秒输入一个字母一样。

for %%i in (h e l l o o o o o o o o o o o o o o) do (
   set /p a=%%i<nul
   ping 0.0.0.0 -n 2.0>nul 2>&1
)
Run Code Online (Sandbox Code Playgroud)

有人可以修改它以便更快地输入吗?

roj*_*ojo 6

ping上述评价溶液是用于与安装的网络接口的计算机一个有价值的溶液(如几乎所有的有)。

@echo off
setlocal

for %%i in (h e l l o o o o o o o o o o o o o o) do (
   set /p "=%%i"<nul
   ping 169.254.0.0 -n 1 -w 500 >nul
)
echo;
goto :EOF
Run Code Online (Sandbox Code Playgroud)

但是,使用此方法识别的最短等待时间似乎是 500 毫秒。如果您将 500 更改为较低的值,您仍然会在字母之间暂停半秒。如果您想要更好的控制,或者如果您的计算机没有网络接口,您将不得不借用另一个运行时环境——例如 JScript。

@if (@CodeSection == @Batch) @then

@echo off
setlocal

for %%i in (h e l l o o o o o o o o o o o o o o) do (
   set /p "=%%i"<nul
   cscript /nologo /e:JScript "%~f0"
)
echo;

goto :EOF
rem // end batch portion

@end
// begin JScript chimera
WSH.Sleep(Math.random() * 250 + 100);
Run Code Online (Sandbox Code Playgroud)

关于选择 ping 的 IP 的注意事项:为了让-w交换机按预期工作,您 ping 的 IP 必须导致“请求超时”。您可以使用不存在的 LAN IP,例如 10.xxx 或 192.168.xx 但对于广泛部署,如果您不能确定这些范围未使用,则 169.254 范围内的链接本地 IP 应该可以正常工作以此目的。请不要使用像 1.1.1.1 或 1.2.3.4 这样的历史 bogon 空间中的 IP。仅仅因为这些地址不回复并不意味着您的数据包不会增加某处的网络拥塞。

最终,随着 IPv4 地址越来越接近完全耗尽,人们需要更加认真地用虚假流量污染互联网。可能 1.1.1.1 和 1.2.3.4 永远不会对任何人有用,因为它们经常被随意的脚本编写者滥用。但这不是增加对这些地址的虐待的理由。 请参阅此页面以进一步阅读,并请保存 bogon。


杰克蝙蝠

为了看看打字机效果能走多远,我编写了一个脚本,输出类似于 X 屏幕保护程序“Jack”的文本。它一遍又一遍地输出同一行,并随机引入印刷错误。运行它,你会着迷,为脚本生根,完成一行没有任何错别字。

@if (@CodeSection == @Batch) @then

@echo off
setlocal

cls
color 70

call :split chars "All work and no play makes Jack a dull boy."

:begin
for %%i in (%chars%) do call :type "%%~i"
echo;
goto begin

:split <var_to_set> <str>
setlocal enabledelayedexpansion
set "line="
set "str=%~2"
for /L %%I in (0,1,43) do set line=!line! "!str:~%%I,1!"
endlocal & set %~1=%line%
goto :EOF

:type <char>
cscript /nologo /e:JScript "%~f0" "%~1"
goto :EOF

@end
// end batch / begin JScript chimera
function pause() { WSH.Sleep(Math.random() * 250 + 100); }
function odds(num) { return !(Math.round(Math.random() * num) % num) }
function backspace() { WSH.StdOut.Write(String.fromCharCode(8)); }

pause();

if (odds(15)) {
    WSH.StdOut.Write(String.fromCharCode(Math.round(Math.random() * 95 + 32)));
    pause();
    if (!odds(20)) {
        backspace();
        pause();
    }
}

if (odds(300)) WSH.Echo('');
if (!odds(400)) WSH.StdOut.Write(WSH.Arguments(0));
Run Code Online (Sandbox Code Playgroud)