批处理中有时候需要用户输入,这就要保证输入合规以获得正确的输出。
比如需要用户输入ip地址来进行一系列操作,以下是一个验证ip地址的示例:
@echo off
:begin
call :input_ip
cls
:input_ip
echo 请输入IP地址:
set /p ip=
if not defined ip (call :ip_error)
call :check_ip
if %errorlevel% == 2 call :ip_error
goto :main
:ip_error
echo 输入了错误的IP
echo.
call :input_ip
:check_ip
%=== 过滤掉\\前缀 ===%
if %ip:~0,2% equ \\ (set ip=%ip:~2%)
%=== 禁止本机127.0.0.1 IP ===%
if %ip% == 127.0.0.1 (exit /b 2)
%=== 超过15个字符长度则输入错误,重新输入 ===%
set len=%ip:~15%
if defined len (exit /b 2)
%=== 正则过滤出符合条件的字符,不符则重新输入 ===%
echo %ip%|findstr "\.\.">nul 2>nul && exit /b 2
echo %ip%|findstr "^[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*$">nul 2>nul || exit /b 2
%=== 每个点分段小于255并大于0 ,不接受.000.这样的格式 ===%
for /f "delims=. tokens=1-4" %%a in ('echo %ip%') do (
set ip_a=%%a
set a_len=!ip_a:~1!
if defined a_len echo !ip_a! |findstr "^0" >nul 2>nul && exit /b 2
if not %%a leq 255 (exit /b 2) else ( if not %%a geq 0 (exit /b 2))
set ip_b=%%b
set b_len=!ip_b:~1!
if defined b_len echo !ip_b! |findstr "^0" >nul 2>nul && exit /b 2
if not %%b leq 255 (exit /b 2) else ( if not %%b geq 0 (exit /b 2))
set ip_c=%%c
set c_len=!ip_c:~1!
if defined c_len echo !ip_c! |findstr "^0" >nul 2>nul && exit /b 2
if not %%c leq 255 (exit /b 2) else ( if not %%c geq 0 (exit /b 2))
set ip_d=%%d
set d_len=!ip_d:~1!
if defined d_len echo !ip_d! |findstr "^0" >nul 2>nul && exit /b 2
if not %%d leq 255 (exit /b 2) else ( if not %%d gtr 0 (exit /b 2))
)
goto :eof
:main
echo.
%=== 显示IP样式为\\1.1.1.1格式 ===%
if %ip:~0,2% equ \\ (echo 你的ip地址是%ip%) else (echo 你的ip地址是\\%ip%)
echo.
echo 按任意键退出
pause >nul 2>nul
exit
以上是使用点分十进制格式的ip作为输入规范,不符合此格式的则要求重新输入。
在实际中,我通常是把这个验证输入的过程做为单独的bat文件模块,通过call外部文件来调用,而不是所有脚本都写在主程序(如命名为main.bat)里。