编写批处理脚本时,我总是遇到此问题。每当我让脚本提示用户设置变量时,如果输入分号(只是一个例子),脚本将关闭。有没有办法阻止它这样做?
示例:
@echo off
:1
cls
echo Please enter your ID:
set /P id=
if /i %id%==119 goto Tom
if /i %id%==204 goto Brittany
if /i %id%==12 goto Shannon
if /i %id%==64 goto Jack
goto 1
:Tom
cls
echo Tom, you have to mow the lawn.
pause>nul
exit
:Brittany
cls
echo Brittany, you have to fold the laundry.
pause>nul
exit
:Shannon
cls
echo Shannon, you have to feed the dog.
pause>nul
exit
:Jack
cls
echo Jack, you have to replace the radio's capacitors.
pause>nul
exit
我会看到运行该脚本:
C:\>myscript.bat
Please enter your ID:
asjfash;dfjlas;ldf
asjfash;dfjlas;ldf==i was unexpected at this time.
并且脚本关闭。
谢谢!
答案 0 :(得分:0)
读取语法:Escape Characters, Delimiters and Quotes:
<强>符强>
分隔符将一个参数与下一个参数分开 - 它们分开了 命令行为单词。
参数通常用空格分隔,但任何一个都是空格 以下也是有效的分隔符:
- 逗号(
,
)- 分号(
;
)- 等于(
=
)- 空格(
)
- 标签(
)
如果用户输入包含上述任何分隔符的字符串(如set "id=1 19"
,则%id%
包含空格),则
if /i %id%==119 goto Tom
结果
if /i 1 19==119 goto Tom
↑ this space causes error 19==119 was unexpected at this time
当然,您需要转义分隔符和所有其他cmd
- 有毒字符,如下所示:
@echo off
:1
cls
echo Please enter your ID:
set /P id=
if /i "%id%"=="119" goto Tom
if /i "%id%"=="204" goto Brittany
if /i "%id%"=="12" goto Shannon
if /i "%id%"=="64" goto Jack
goto 1
rem script continues here
仅供参考,Redirection article列出了其他cmd
- 需要转义的有毒字符,因为它们在批处理脚本中的未转义事件具有以下含义:
&
- Single Ampersand :用作命令分隔符&&
- Double Ampersand :条件命令分隔符(如if errorlevel 0
)||
- Double Pipe (垂直线):条件命令分隔符(如if errorlevel 1
)|
- 单一管道:将一个命令的std.output重定向到另一个命令的std.input>
- Single Greater Than :将输出重定向到文件或文件,如设备>>
- Double Greater than :输出将添加到文件的最后<
- 小于:将文件内容重定向到命令的std.input