我正在为windows建立一个虚拟机,但vm是ms-dos的,我知道msdos基本上是一个批处理文件,所以我试着做它,接受一件事,我想让它接受用户输入,但为了使它更像原始的,我开始在C:驱动器,而不是C:用户你的名字,但我不希望它显示该命令,不,我不是一个批处理文件编码谁包含任何其他语言的知识,我知道C++,javascript,html,css等。我只是在用批处理来做我的vm,我试着把echo关闭,所以我去了我的pal stack overflow和macros!我不能用宏来做基于用户的输入!任何关于我的ms-do的knolodge都会被感激。
@echo off
echo This is mosdos virtual machine, i know batch = yucky but MSDOS operated in batch so in order to replicate the experiance i created a batch file
cd C:
@echo on
是的,你可以在批处理脚本中使用宏来输出用户输入,只是语法与你所期望的不同。
这里是一个处理用户输入的宏的例子。
@Echo off
Setlocal DisableDelayedExpansion
(Set LF=^
%= Above Empty lines Required =%)
Set ^"\n=^^^%LF%%LF%^%LF%%LF%^^"
::: { %@I_O%<[Var Name]>,<[/O Output Var] [/S Set Var]>,<[Prompt for /S Set /P]>
Set @I_O=For %%n in (1 2) Do if "%%n" == "2" (%\n%
For /F "Tokens=1,2,3 Delims=," %%G in ("!Param!") Do (%\n%
IF "%%~H" == "/O" (ECHO/%%G = !%%~G!)%\n%
IF "%%~H" == "/S" (Set %%~G=)%\n%
IF "%%~H" == "/S" For /L %%# in (1 1 5) Do If "!%%~G!" == "" (Set /P "%%~G=%%~I ")%\n%
)%\n%
) Else Set Param=,
::: }
Setlocal EnableDelayedExpansion
:Example
%@I_O%Name,/S,Enter your Name:
IF /I "!Name!" == "Exit" (Exit /B 0)
%@I_O%Name,/O
Goto :Example
并解释它是如何构造的。
LF转义字符 ^
是用来构建 /n
新行变量,允许定义多行变量命令。
为了定义宏命令来处理尚未定义的变量,宏是在延迟扩展被禁用的环境中定义的,允许在宏中定义 "未来变量"。
宏本身使用两个嵌套 For
循环,通过外层的If Else结构 "捕获 "参数。%%n
循环,内部的For循环将这些参数分解为 tokens
使用分隔符 ,
在这个例子中,要用传递给宏的参数颁布的逻辑是包含在嵌套循环的中心。
嵌套循环的核心部分包含了要用传递给宏的参数来执行的逻辑。
在脚本中使用它们的内容之前,应该采取步骤来验证用户的输入--在这个例子中,A for L循环与一个关于变量定义的条件检查已经被用来促进变量的定义,要求变量在用户输入之前是未定义的。
一旦宏被定义后,需要启用延迟扩展才能使用它。