【问题标题】:Batch-Hybrid Special Character Fault?批量混合特殊字符故障?
【发布时间】:2021-10-31 05:22:54
【问题描述】:

据我所知,一些特殊字符如果使用“”回显它们是可以显示的。我只是停留在代码上,试图弄清楚我可以在哪里更改以使其正常工作。我看不出问题。来自here 的代码。 我需要的是一个可以为我编写动画然后退出的特殊代码。就这样。我从there 复制了代码,修改后可以使用typewriter.bat "text" "charsnum-1" 调用它,例如typewriter "Hello" 4。虽然我真正不了解 Batch Hybrids,而且即使知道如何解释代码,我也看不出符号卡在哪里。

重现我的问题:typewriter.bat "Hello?" 5

代码:

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

@echo off
setlocal

color 70
set charnuu=%2

call :split chars %1

:begin
for %%i in (%chars%) do call :type "%%~i"
exit /b
goto begin

:split <var_to_set> <str>
setlocal enabledelayedexpansion
set "line="
set "str=%~2"
for /L %%I in (0,1,%charnuu%) 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() * 50 + 50); }
function odds(num) { return !(Math.round(Math.random() * num) % num) }


pause();

if (odds(300)) WSH.Echo('');
if (!odds(400)) WSH.StdOut.Write(WSH.Arguments(0));

此代码没有显示常见符号,甚至没有显示基本符号,例如 ?。也许我太累了,看不到它。帮帮我。

【问题讨论】:

  • 问号不能用于常规的 for 循环 - 请参阅 this question 了解更多详细信息。此外,该脚本并没有按照您的想法执行,如果您阅读底部的 rojo 评论,您会发现它是一个旨在通过故意在字符串中添加拼写错误的机会来模拟屏幕保护程序的脚本。这不是你想要的。
  • 我建议您尝试解释脚本的用途、您希望作为参数传递给它的内容以及您希望发生的具体情况。我最好的猜测是,您希望最终用户输入两个参数,(一个字符串和一个整数),然后看起来像打字机一样逐个字符地键入该字符串,直到整数个字符被键入。如果这是您想要做的,那么根本不需要混合脚本,可以使用带有标准内置实用程序的批处理文件来完成。
  • @Compo 真的吗?如何?另外,是的,完全正确。
  • @SomethingDark 是的,我知道,我删除了这个错误的机会。我在 Batch 上制作游戏,所以修改和理解游戏会很容易,但我想要一些动画、声音......普通游戏可以做的一切......没有太多的图形方案。
  • @SomethingDark 另外,是的,游戏中的拼写错误也可以。尤其是随机的。

标签: batch-file cmd jscript


【解决方案1】:

常规的for 循环无法处理问号,但您可以通过完全不使用循环处理单个字母而仅将整个字符串作为一个整体进行迭代来解决这个问题:

@echo off

REM Just kinda honor-system the string length since this is proof of concept
REM     but remember that string indices start at 0
set "string=%~1"
set "string_length=%~2"

REM Generate a backspace character for later
for /f %%A in ('"prompt $H&for %%B in (1) do rem"') do set "BS=%%A"

REM The setlocal is down here instead of at the top like it usually is to handle
REM     strings that contain exclamation points.
REM There's a period followed by a backspace before the substring is printed in
REM     case the current character happens to be a space (which otherwise
REM     wouldn't get printed).
REM The timeout /t 0 is because timeout is an external command that technically
REM     needs a few milliseconds to start up, so setting the wait period to 0
REM     seconds actually generates a pause shorter than 1 second.
setlocal enabledelayedexpansion
for /L %%A in (0,1,%string_length%) do (
    <nul set /p "=.%BS%!string:~%%A,1!"
    >nul timeout /t 0
)

【讨论】:

  • 那里真的有大量的知识!但我得到的文字是.H.e.l.l.o.?,而不是我所期望的,也许我实现了一些错误?感谢timeout /t 0 的提示!但我仍然认为静默 ping 或 timeout /t 1 更准确一些我想要的时间。感谢您的帮助!
  • 啊,看起来 StackOverflow 没有包含应该在 . 之后的退格字符;我已更新代码以包含更明显的退格字符
  • 哦!知道了。要去搜一下你能把它粘贴到我可以复制的地方吗?
  • 另外,你知道有人回答了如何批量制作纯字符计数器吗?
  • 你不可能期望有人有 100% 相同的问题。这个想法是你研究和调整解决方案,这个站点是一个代码资源,你可以通过研究你自己使用的任何命令来适应你的具体情况。它不是一个根据您的确切要求为您编写代码、为您提供链接或可以为您执行搜索和研究的人的姓名的网站。如果你对你发现、研究、改编和运行的代码有另一个问题,但在某种程度上失败了,那么你就有了一个新问题。在这里,我们针对每个问题帖子处理一个问题。
猜你喜欢
  • 2022-01-22
  • 1970-01-01
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-12
  • 1970-01-01
  • 2014-07-29
相关资源
最近更新 更多