【问题标题】:Batch File: Typewriter Effect批处理文件:打字机效果
【发布时间】:2015-02-06 15:49:34
【问题描述】:

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

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
)

有人可以修改它以使其打字更快吗?

【问题讨论】:

  • 使用 ping 超时参数-w。示例:ping 10.1.1.1 -n 1 -w 500 &gt;nul 完整输入示例:gist.github.com/davidruhmann/6073962
  • 您可以尝试添加等待参数(ping 0.0.0.0 -n 2 -w 500&gt;nul 2&gt;&amp;1)。时间以毫秒为单位(1 秒为 1000 毫秒),因此 500 为 0.5 秒。
  • @KenWhite 0.0.0.0 不起作用。它必须是导致“请求超时”的 IP。错误。 @David 我建议 169.254.0.0 将是一个值得普遍使用的 IP,因为 10.x192.168.x172.16-31.x 可能不会像人们希望的那样伪造。
  • @rojo:我从问题中获取了现有命令并向其添加了一个参数。如果您对所使用的地址有疑问,请与问题海报讨论。 :-)

标签: batch-file cmd


【解决方案1】:

上述 cmets 中的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

但是,使用此方法识别的最短等待时间似乎是 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);

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

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


Jack.bat

为了看看打字机效果能走多远,我编写了一个脚本,输出类似于 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));

【讨论】:

  • “bogon” 是一个很棒的词——我实际上从未听说过它。 Bogon 空间是一种重要的不可再生资源。
【解决方案2】:

试试这个代码:消息打字机 + 语音

@echo off
Title Typewriter with speaking voice by Hackoo 2016
Color 0A & Mode con cols=70 lines=3
set Msg="This is only a testing string to see if my script really works or not?"
Call :Typewriter %Msg%
set Msg="              What are you doing now dude ?"
Call :Typewriter %Msg%
set Msg="         I want to say Hello for everybody on StackOverflow !"
Call :Typewriter %Msg%
pause>nul
Exit /b
::*********************************************************************
:TypeWriter
Cls
echo(
(
echo strText=wscript.arguments(0^)
echo intTextLen = Len(strText^)
echo intPause = 150
echo For x = 1 to intTextLen
echo     strTempText = Mid(strText,x,1^)
echo     WScript.StdOut.Write strTempText
echo     WScript.Sleep intPause
echo Next
echo Set Voice=CreateObject("SAPI.SpVoice"^)
echo voice.speak strText
)>%tmp%\%~n0.vbs
@cScript.EXE /noLogo "%tmp%\%~n0.vbs" "%~1"
exit /b
::********************************************************************* 

【讨论】:

    【解决方案3】:
    @echo off
    setlocal enableextensions enabledelayedexpansion
    
    set lines=1
    
    
    set "line1=Check it out M8! Im typing but not typing! BEWM! BEWM! BEWM!"
    
    
    for /f %%a in ('"prompt $H&for %%b in (1) do rem"') do set "BS=%%a"
    
    for /L %%a in (1,1,%lines%) do set num=0&set "line=!line%%a!"&call :type
    
    pause>nul
    goto :EOF
    
    :type
    set "letter=!line:~%num%,1!"
    set "delay=%random%%random%%random%%random%%random%%random%%random%"
    set "delay=%delay:~-6%"
    if not "%letter%"=="" set /p "=a%bs%%letter%" <nul
    
    :: adjust the 3 in the line below: higher is faster typing speed
    
    for /L %%b in (1,3,%delay%) do rem
    if "%letter%"=="" echo.&goto :EOF
    set /a num+=1
    goto :type
    

    【讨论】:

    • 很高兴看到这有帮助:)
    【解决方案4】:

    ping 0.0.0.0 几乎立即给出PING: transmit failed. General failure 错误消息。

    根据rojo的暗示性评论编辑

    最好从Private-Use Network range 中选择返回Request timed out 消息的某个地址。

    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 a.b.c.d -4 -n 1 -w 500>nul 2>&1
    )
    

    这里:

    • a.b.c.d = 返回Request timed out 消息的地址,请参见下面的 (*)。

    • -4 = 强制使用 IPv4。

    • -n 1 = 要发送的回显请求数(一个)。

    • -w 500 = 等待每个回复的超时时间(以毫秒为单位)(500=1/2 秒);这应该工作到 cca 5 秒(一个不成功的回显请求的大约时间)。

    (*) 以下 IPv4 地址范围已由 IANA 保留用于私有互联网,并且不可在全球互联网上公开路由:

     10.0.0.0     --   10.255.255.255  (10/8       prefix)
     172.16.0.0   --   172.31.255.255  (172.16/12  prefix)
     192.168.0.0  --   192.168.255.255 (192.168/16 prefix)
    

    【讨论】:

    • Nooo,1.1.1.1 不是一个好用的 IP!它不在保留范围内,污染它弊大于利。 See this articlethis one。请修改您的答案。使用169.254 或其他范围。
    【解决方案5】:
    @echo off
    mode con:cols=80 lines=25
    rem CenterSelf
    set FGcol=10
    rem ChangeColor %FGcol% 0
    rem PrintBoxAt 12 31 3 20 2
    rem ChangeColor 0 %FGcol%
    
    rem Wait 30
    REM COPY FILES HERE
    
    rem ShadeBoxAt 13 32 1 2 2
    
    rem Wait 30
    REM COPY MORE FILES HERE
    
    rem ShadeBoxAt 13 34 1 2 2
    
    rem Wait 30
    REM COPY MORE FILES HERE
    
    rem ShadeBoxAt 13 36 1 2 2
    
    rem Wait 30
    REM COPY MORE FILES HERE
    
    rem ShadeBoxAt 13 38 1 2 2
    
    rem Wait 30
    REM COPY MORE FILES HERE
    
    rem ShadeBoxAt 13 40 1 2 2
    
    rem Wait 30
    REM COPY MORE FILES HERE
    
    rem ShadeBoxAt 13 42 1 2 2
    
    rem Wait 30
    REM COPY MORE FILES HERE
    
    rem ShadeBoxAt 13 44 1 2 2
    
    rem Wait 30
    REM COPY MORE FILES HERE
    
    rem ShadeBoxAt 13 46 1 2 2
    
    rem Wait 30
    REM COPY MORE FILES HERE
    
    rem ShadeBoxAt 13 48 1 2 2
    
    rem ClearColor
    rem Locate 25 1
    pause
    

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 2017-02-21
    • 1970-01-01
    • 2017-02-07
    • 2013-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多