如何检查variables是否包含batch file中的特殊字符

如何检查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(以及其他)详尽的答案。 引人入胜,迷人的阅读…

  • Windows命令解释器(CMD.EXE)如何解析脚本?
  • 为什么在管道代码块内部延迟扩展会失败?

并详细说明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进程中进行扩展。
如果启用延迟扩展,则不重要,线路始终工作。
而我改变了正则表达式,至于搜索引用本身有点讨厌。