我正在尝试了解发送给我的批处理文件,以便在他们解决问题时解决第三方程序中的错误。基本上,他们正在运行 findstr 正则表达式命令以确定字符串是否匹配。如果是这样,则在将其传递给原始命令行程序之前,将手动重新添加不应删除的特殊字符。
尽我所知,所提供的内容不起作用或我不明白。我在下面粘贴相关的代码部分。
@echo off
setlocal
set username=%1
shift
echo %username% | findstr /r "^\"[0-9][0-9]*\"" >nul
if not errorlevel 1 (set username=";%username:~0,9%=%username:~10,4%?")
echo %username%
我真正有疑问的三件作品如下:
- 我相信上述正则表达式的未转义解释是
^"[0-9][0-9]*"
我认为这意味着字符串必须以数字字符开头,然后必须包含零个或多个额外的纯数字字符才能找到匹配项。好吧,FINDSTR 似乎对转义的引号做了一些奇怪的事情,我无法让它与我尝试过的任何东西相匹配。如果我删除\"
周围,[0-9][0-9]*
那么我可以让它工作,但它不能正确拒绝非数字字符,例如输入字符串123456789O1234
(该示例字符串中有一个字母 O 而不是零)。 - 有什么意义
>nul
- 检查等于 0 的错误级别而不是“非错误级别 1”不是更好吗,因为它可能返回错误级别 2?
无论如何,以下代码有效,但并不像我想要的那样精确。我只是想了解为什么正则表达式字符串中的引号不起作用。也许这是 FINDSTR 的一个限制,但我还没有遇到任何确定的东西。
@echo off
setlocal
set username=%1
shift
echo %username% | findstr /r "^[0-9][0-9]*" >nul
if not errorlevel 1 (set username=";%username:~0,9%=%username:~10,4%?")
echo %username%
我可以通过重复类 14 次来解决这个问题,因为这是我的情况下的字符数(超过 15 个类会导致它崩溃- 滚动到底部)。我仍然对如何更简单地实现这一点感到好奇,当然还有剩下的 2 个问题。
编辑/工作解决方案
@echo off
setlocal enableDelayedExpansion
set username=%~1
shift
echo !username!|findstr /r /c:"^[0-9][0-9]*$" >nul
if not errorlevel 1 (set username=";!username:~0,9!=!username:~10,4!?")
echo !username!
笔记:
- 当我将现有代码修改为更接近 dbenham 的代码后第一次运行它时,enableDelayedExpansion和设置用户名的引号一样给出了错误(见下文)。我无法复制我做错的事情,但现在一切正常(以防其他人遇到同样的问题)。
- 我曾尝试使用
$
EOL 标记(这是强制它仅匹配数字内容的关键),但我认为其他问题阻碍了我认为这不是解决方案。此外,为了确保$
作品不会错过这部分 dbenham 的回答“......您还必须确保您的回显值和管道符号之间没有空格。” - 简而言之,似乎试图在 findstr 的正则表达式中添加双引号是错误的语法/不起作用/等等...除非您实际上正在寻找匹配 " 在您正在解析的字符串/文件中。请参阅 dbenham 的答案为了清楚起见,正如他所指出的,您可以使用 %~1 从参数中去除引号,而不是将其添加到您的正则表达式中(并在需要时以编程方式将它们重新添加)。
错误信息
C:>sample.bat 123456789
'enableDelayedExpansion' is not recognized as an internal or external command,
operable program or batch file.
'"' is not recognized as an internal or external command,
operable program or batch file.
!username!
参考链接: