我试图理解发送给我的批处理文件,以便在第三方程序解决问题时解决该错误。基本上,他们正在运行 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]*"
我认为这意味着字符串必须begin带有数字字符,然后必须包含零个或多个额外的仅数字字符以便找到匹配项。好吧,FINDSTR 似乎对转义引号做了一些奇怪的事情,我无法让它与我尝试过的任何内容相匹配。如果我删除\"
around [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 个类会导致崩溃- 滚动到底部)。我仍然很好奇如何更简单地实现这一点,当然还有剩下的两个问题。
编辑/工作解决方案
@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!
NOTES:
- 当我修改现有代码以使其更类似于 debenhams 后首次运行它时,启用延迟扩展给出了一个错误,就像设置用户名的引号一样(见下文)。我无法复制我做错的事情,但现在一切都正常了(以防其他人遇到同样的问题)。
- 我曾尝试过
$
对于 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!
参考链接:
- Windows FINDSTR 命令未记录的功能和限制
- findstr 的区分大小写异常(在某些情况下无法正确处理大小写)
- http://ss64.com/nt/findstr.html
- http://www.robvanderwoude.com/findstr.php
- http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/findstr.mspx