gpt4 book ai didi

batch-file - 检查标签是否存在 cmd

转载 作者:行者123 更新时间:2023-12-03 18:17:49 27 4
gpt4 key购买 nike

我想知道有没有办法检查批处理文件中是否存在标签?

If %input%=ABC (  
If Label ABC Exists (
Goto ABC
)
)

我怎样才能做到这一点?
任何帮助将不胜感激。

最佳答案

findstr /i /r /c:"^[ ]*:%input%\>" "%~f0" >nul 2>nul && goto %input%

搜索当前批处理文件中的标签,如果没有errorlevel,则标签存在

已编辑 - 我意识到我处理标签末尾的方式有误,我打算编辑答案(无论如何它已经被编辑了),我看到了 dbenham 声明。他看到了错误并纠正了它。谢谢你。一如既往的好答案,但这比你所暴露的更糟糕。

在这一刻我只有一个 XP 来测试,但这对我有用。如果有人可以在更高的 Windows 版本上进行测试,请。

第一个问题 : 标签的开始。像往常一样,dbenham 是正确的,集合中的任何字符都是 [;=,<space><tab>0xFF]可以在标签的冒号之前,单独或重复。但是,只要它是行上的第一个字符,并且不重复,几乎任何字符都可以放在标签的冒号之前(一个异常(exception)是其他冒号)。因此,以下将正常工作
    call :test
goto :test
echo this will not be echoed

X=;=:test
echo Hello

不,这不是有效的行,如果解析器尝试执行标签行,则会发生“无法识别命令”错误,但是 是有效标签 打电话或转到。

第二个问题 : 标签结束。正如 dbenham 所指出的,当标签用于定义函数/过程时,我们大多数人都会放置一个空格和参数列表。这是我意识到的错误,并且在我的原始答案中已更正。但是,空格(显然是行尾)并不是标签名称后唯一允许的字符。因此,在前面的示例中,以下任何标签都可以使用
:test arguments
:test:arguments
:test>arguments
:test<arguments
:test&arguments

是的,在这种情况下,它们是解析器的有效命令并且是有效的标签

而且,当然,这两个“问题”可以同时发生
    call :test
goto :test
echo this will not be echoed

< ;;:test:;; > This WORKS
echo Hello

POST EDIT 1 - 似乎所有这些工作都是几年前在 dostips.com 上完成的。感谢所有编译评论中引用的详尽列表的人。下次我先搜索一下。

POST EDIT 2 - 我一直在尝试解决 findstr 的局限性以包含所有情况。嗯,没有办法。有太多限制,首先是不可能在正则表达式中包含 0xff 字符。

对于稳健且简单的解决方案,dbenham 的答案是最佳选择。

对于更强大但仍然不完整,没有防弹版本,并且比 dbenham 的答案更复杂
@echo off

for /l %%i in (1 1 10) do (
call :testLabelExist "test%%i" && echo Label [test%%i] exist || echo Label [test%%i] does not exist
)
exit /b

:test1
:test2
:test3
x:test4
::test5
:test6:
:test7#
:test8 parameters
:test9 parameters
:test10:myData


:testLabelExist
for /f "delims=" %%t in (
'forfiles /p "%~dp0." /m "%~nx0" /c "cmd /d /c @echo 0x09"'
) do (
findstr /i /m /r /c:"^[^:]*[ %%t]*:%~1[ %%t:;,=+]" /c:"^[^:]*[ %%t]*:%~1$" "%~f0" >nul 2>nul
)
exit /b %errorlevel%

它仍然省略了引用的标签名称,只是为了命名一个失败点。

关于batch-file - 检查标签是否存在 cmd,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21348579/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com