防止批处理脚本在无效字符输入时终止

时间:2017-02-01 08:36:34

标签: windows batch-file variables scripting

编写批处理脚本时,我总是遇到此问题。每当我让脚本提示用户设置变量时,如果输入分号(只是一个例子),脚本将关闭。有没有办法阻止它这样做?

示例:

@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.

并且脚本关闭。

谢谢!

1 个答案:

答案 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
  •