如何检查batch file中的variables是否包含特殊字符? 例如,如果我的variables包含一个文件名,那么文件名不应该包含像\/ < > | : * " ?
这样的字符 \/ < > | : * " ?
这些。
@echo off set param="XXX" echo %param%| findstr /r "^[^\\/?%*:|"<>\.]*$">nul if %errorlevel% equ 0 goto :next echo "Invalid Attribute" :next echo correct
我用这个链接作为参考正则expression式来validation文件夹名称和文件名
你不能使用echo %param%| findstr /r ...
echo %param%| findstr /r ...
甚至不会echo !param!| findstr /r ...
echo !param!| findstr /r ...
有关如何分析和处理管道的更多信息,请看这个问题和答案: 为什么在管道代码块内部延迟扩展失败 。
使用一个辅助(临时)文件如下:
@ECHO OFF SETLOCAL EnableExtensions EnableDelayedExpansion :testloop set "param=" set /P "param=string to test (hit <Enter> to end)> " if not defined param goto :endtest >"%temp%\33605517.txt" echo(!param! rem next line for debugging purposes for /F "usebackq delims=" %%G in ("%temp%\33605517.txt") do set "_marap=%%G" findstr /r ".*[<>:\"\"/\\|?*%%].*" "%temp%\33605517.txt" >nul if %errorlevel% equ 0 ( echo !errorlevel! Invalid !param! [!_marap!] ) else ( echo !errorlevel! correct !param! [!_marap!] ) goto :testloop :endtest ENDLOCAL goto :eof
.*[<>:\"\"/\\|?*%%].*
正则表达式解释 :
.*
– 零个或多个出现在字符串前的任何字符; [<>:\"\"/\\|?*%%]
保留字符集中的任何一个字符:
<
(小于); >
(大于); :
冒号); "
(双引号)转义为\"\"
(findstr和批解析器); /
(正斜杠); \
(反斜杠)作为\\
(findstr)转义; |
(竖条或管道); ?
(问号); *
(星号); %
(百分号)转义(对于批解析器)为%%
; 实际上, %
不是为NTFS
文件系统保留的,而是需要在纯的cmd
和/或批处理脚本中进行特殊的转义。 .*
– 在字符串结尾的任何字符的零次或多次出现。 这里有更多的关于SO的一些问题的链接,Aacini,DBenham,Jeb(以及其他)详尽的答案。 引人入胜,迷人的阅读…
并详细说明David Deley 如何解析命令行参数 ,©2009(更新2014)
输出 :
string to test (hit <Enter> to end)> n<m 0 Invalid n<m [n<m] string to test (hit <Enter> to end)> n>m 0 Invalid n>m [n>m] string to test (hit <Enter> to end)> n:m 0 Invalid n:m [n:m] string to test (hit <Enter> to end)> n/m 0 Invalid n/m [n/m] string to test (hit <Enter> to end)> n\m 0 Invalid n\m [n\m] string to test (hit <Enter> to end)> n|m 0 Invalid n|m [n|m] string to test (hit <Enter> to end)> n?m 0 Invalid n?m [n?m] string to test (hit <Enter> to end)> n*m 0 Invalid n*m [n*m] string to test (hit <Enter> to end)> n"m 0 Invalid n"m [n"m] string to test (hit <Enter> to end)> nm 1 correct nm [nm] string to test (hit <Enter> to end)> nm.gat 1 correct nm.gat [nm.gat] string to test (hit <Enter> to end)> n%m.gat 0 Invalid n%m.gat [n%m.gat] string to test (hit <Enter> to end)>
你可以改变你的findstr行
set "param=Test < string" cmd /v:on /c echo(^^!param^^! | findstr /r "^[^\\/?%%*:|<>\.\"]*$^" > nul if %errorlevel% equ 0 ( echo OK ) ELSE ( echo Invalid, special character found )
这是有效的,因为参数将在扩展的子cmd.exe进程中进行扩展。
如果启用延迟扩展,则不重要,线路始终工作。
而我改变了正则表达式,至于搜索引用本身有点讨厌。