我正在尝试了解发送给我的批处理文件,以便在解决问题时解决第三方程序中的错误。基本上,它们正在运行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
无论如何,以下代码有效,但它并不像我想的那么精确。我只是想了解为什么正则表达式字符串中的引号不起作用。也许这是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次来解决这个问题,因为那是我情况下的字符数(more than 15 classes will cause it to crash - 滚动到底部)。我仍然很好奇如何更简单地实现这一目标,当然还有剩下的两个问题。
@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!
注意:
$
作为EOL标记(这是强制它仅与数字内容匹配的关键),但我认为其他问题正在妨碍我认为它不是解。另外,为了确保$
的作品不要错过dbenham的答案“......你还必须确保你的回音值和管道符号之间没有空格。”错误消息
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!
参考链接:
答案 0 :(得分:4)
以相反的顺序回答您的问题:
3)if not errorlevel 1
可能与if %errorlevel%==0
相同,因为IF ERRORLEVEL 1表示ERRORLEVEL大于或等于1.因此将NOT置于前面意味着ERRORLEVEL小于1。相信FINDSTR永远不会返回负ERRORLEVEL,所以语法应该没问题。
2)>nul
将FINDSTR的stdout输出重定向到nul设备,这意味着它会禁用输出。通常会打印任何匹配的行。您只对返回代码感兴趣 - 您不希望看到输出。
1)原始正则表达式将匹配以引号开头的任何输入字符串,后跟至少一个数字,然后是另一个引号。它会忽略第二个引用后可能出现的任何字符。
所以以下字符串(包括引号)将匹配:
以下字符串不匹配:
如果匹配字符串中的位数达到一定长度,则原始代码会出现问题,因为结尾引用会被剥离,导致结束时被引用,因此脚本的其余部分都会失败。
我不了解您的要求,所以我不知道如何修复代码。
听起来你不想匹配非数字字符串。这意味着您需要在正则表达式的末尾包含行结束标记$。但是,您还必须确保回显值和管道符号之间没有空格。
我相信你可能不希望你的价值引用,(或者你应该以编程的方式在最后添加它们)。您可以使用%~1从提供的参数中去除任何封闭引号。
如果您要检查参数1是否只包含数字,则可以使用:
setlocal enableDelayedExpansion
set "username=%~1"
echo !username!|findstr /r "^[0-9][0-9]*$" >nul
我使用了延迟扩展,因为你无法控制%1中的字符,如果它包含像&amp ;;这样的特殊字符。或者如果使用正常扩展,它将导致问题。我给出的语法不是防弹,但它处理大多数“正常”情况。
在您的情况下没有必要,但我更喜欢使用/ c选项,以防您的搜索字符串包含空格。所以上面的内容可以写成
echo !username!|findstr /r /c:"^[0-9][0-9]*$" >nul
对我而言,如果它与你的正则表达式不匹配,那么原始代码和修改后的代码都会简单地通过用户名。也许这是你的意图,也许不是。