AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / computer / 问题 / 1643414
Accepted
bat_cmd
bat_cmd
Asked: 2021-04-21 20:08:13 +0800 CST2021-04-21 20:08:13 +0800 CST 2021-04-21 20:08:13 +0800 CST

对 goto 标签(批处理文件)Windows 感到困惑

  • 772

如果我以这种方式使用这些命令,它会做它应该做的事情:

如果foo 以前设置为一件事或另一件事,它会跳到foobar_menu

如果foo以前没有设置为(相同的)一件事或另一件事,它会跳到another_menu

rem Check if foo was previously set as bar1 or bar2...
if "%foo%"=="bar1" goto :foobar_menu
if "%foo%"=="bar2" goto :foobar_menu

rem Check if foo was NOT previously set as bar1 or bar2...
if not "%foo%"=="bar1" goto :another_menu
if not "%foo%"=="bar2" goto :another_menu

这就是为什么它让我感到困惑 - 如果我如下所示交换它们,那么它不能正常工作,它会进入错误的标签,但为什么呢?

rem Check if foo was NOT previously set as bar1 or bar2...
if not "%foo%"=="bar1" goto :another_menu
if not "%foo%"=="bar2" goto :another_menu

rem Check if foo was previously set as bar1 or bar2...
if "%foo%"=="bar1" goto :foobar_menu
if "%foo%"=="bar2" goto :foobar_menu

为什么这两件事不做同样的事情?

这是因为我没有将 goto 部分放在括号中吗?

我确实让它工作(第一种方式),但这与我的菜单进入的顺序不同,我只是希望它按照上面第二个(非工作)示例中的布局方式运行。

干杯。

编辑:

这些是实际的命令。choose_audio_sample_rate以这种方式放置时,尽管是嵌套的,但即使在变量下设置了 opus 或 libopus ,它仍然会进入标签。

if not "%audio_codec%"=="libopus" if not "%audio_codec%"=="opus" goto :choose_audio_sample_rate
if "%audio_codec%"=="libopus" if "%audio_codec%"=="opus" goto :choose_audio_sample_rate_opus

实际上,交换的版本也不起作用,choose_audio_sample_rate即使在变量下设置了 opus 或 libopus 也是如此。

if "%audio_codec%"=="libopus" if "%audio_codec%"=="opus" goto :choose_audio_sample_rate_opus
if not "%audio_codec%"=="libopus" if not "%audio_codec%"=="opus" goto :choose_audio_sample_rate

我在这里变成了一个疯子,哈哈,好吧,如果我只使用它,它就会起作用(并直接传递到非作品菜单):

if "%audio_codec%"=="libopus" (goto :choose_audio_sample_rate_opus)
if "%audio_codec%"=="opus" (goto :choose_audio_sample_rate_opus)

如果它是 libopus,它会转到正确的标签。如果不是 libopus,则处理下一行,如果是 opus,则转到正确的标签。

如果超出此范围,则 libopus 或 opus 都不是,它会继续进入一般菜单。

windows batch
  • 3 3 个回答
  • 141 Views

3 个回答

  • Voted
  1. Best Answer
    Appleoddity
    2021-04-21T20:28:38+08:002021-04-21T20:28:38+08:00

    您的批处理文件自上而下执行。

    在第二个示例中,即使设置了foo2or foo1,它也总是会转到:another_menu。批处理文件将通过这两个语句的唯一方法是同时设置foo1和foo2。

    您实际上是在创建一个逻辑 OR 情况。

    如果 foo1 OR foo2 未设置,则转到 another_menu

    别的

    如果设置了 foo1 OR foo2 转到 foobar_menu

    别的

    没做什么

    而第一个例子,

    如果设置了 foo1 OR foo2 转到 foobar_menu

    别的

    如果 foo1 OR foo2 未设置,则转到 another_menu

    别的

    没做什么

    你需要的是一个逻辑与。批处理文件 IF 语句不支持 AND 或 OR。所以,我们像这样嵌套或链接它们:

    if not "%foo1%"=="bar1" if not "%foo2%"=="bar2" goto :another_menu
    

    这就是说,如果 foo1 没有设置,那么如果 foo2 没有设置 goto :another_menu

    或者,更容易的是,如果 foo1 AND foo2 未设置转到 another_menu

    • 2
  2. T3RR0R
    2021-04-22T18:31:15+08:002021-04-22T18:31:15+08:00

    通过使用 findstr 可以稍微简化您的逻辑

     Echo("%foo%"|Findstr /C:"bar1" /C:"bar2" > nul && Goto :FooBarMenu || Goto :AnotherMenu
    
    

    逻辑: Findstr 将字符串%foo%与 bar1 和 bar2 进行比较。如果匹配,则命令成功完成,条件运算符&&执行以下命令。如果不匹配,||则触发条件运算符执行以下命令,因为前面的命令没有成功执行。

    例子:

    @Echo off
     Set "foo=notbar"
    
    :loop
     Echo("%foo%"|Findstr /C:"bar1" /C:"bar2" > nul ^
     && Call :fooBarMenu foobarMenu || Call :AnotherMenu Anothermenu
     If not defined foo Exit /B 0
    Goto :loop
    
    :foobarmenu
     Echo(@ %~1 foo = %foo%
     Set "foo="
    Exit /B 0
    
    :Anothermenu
     Echo(@ %~1 foo = %foo%
     Set "foo=bar2"
    Exit /B 0
    
    • 1
  3. Stephan
    2021-04-23T01:11:39+08:002021-04-23T01:11:39+08:00

    您已经检查了bar1和bar2。所以没有必要再次检查它bar1是否bar2不是(当代码流到达这一点时它肯定不是,因为你已经在其他地方分支了它)。

    rem Check if foo was previously set as bar1 or bar2...
    if "%foo%"=="bar1" goto :foobar_menu
    if "%foo%"=="bar2" goto :foobar_menu
    rem no need to check if foo was NOT previously set as bar1 or bar2
    rem if FOO is anything other than the previously checked values, 
    rem your code will continue here anyway.
    echo FOO isn't bar1 or bar2.
    rem Don't forget to end this branch of your code or it will just continue to run:
    goto :eof
    :foobar_menu
    echo reached foobar.
    

    您可能需要考虑使用/iswitch withif来忽略大小写
    (if "foo"=="FOO"为假,if /i "foo"=="FOO"为真)

    • 1

相关问题

  • 批量重命名图像文件集

  • Python 的“pass”参数的批处理等价物是什么?

  • 在 Windows 上与 Docker 守护进程通信

  • 资源管理器侧面板中的桌面外壳快捷方式

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何减少“vmmem”进程的消耗?

    • 11 个回答
  • Marko Smith

    从 Microsoft Stream 下载视频

    • 4 个回答
  • Marko Smith

    Google Chrome DevTools 无法解析 SourceMap:chrome-extension

    • 6 个回答
  • Marko Smith

    Windows 照片查看器因为内存不足而无法运行?

    • 5 个回答
  • Marko Smith

    支持结束后如何激活 WindowsXP?

    • 6 个回答
  • Marko Smith

    远程桌面间歇性冻结

    • 7 个回答
  • Marko Smith

    子网掩码 /32 是什么意思?

    • 6 个回答
  • Marko Smith

    鼠标指针在 Windows 中按下的箭头键上移动?

    • 1 个回答
  • Marko Smith

    VirtualBox 无法以 VERR_NEM_VM_CREATE_FAILED 启动

    • 8 个回答
  • Marko Smith

    应用程序不会出现在 MacBook 的摄像头和麦克风隐私设置中

    • 5 个回答
  • Martin Hope
    Saaru Lindestøkke 为什么使用 Python 的 tar 库时 tar.xz 文件比 macOS tar 小 15 倍? 2021-03-14 09:37:48 +0800 CST
  • Martin Hope
    CiaranWelsh 如何减少“vmmem”进程的消耗? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Windows 10 搜索未加载,显示空白窗口 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    v15 为什么通过电缆(同轴电缆)的千兆位/秒 Internet 连接不能像光纤一样提供对称速度? 2020-01-25 08:53:31 +0800 CST
  • Martin Hope
    andre_ss6 远程桌面间歇性冻结 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney 为什么在 URL 后面加一个点会删除登录信息? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension 鼠标指针在 Windows 中按下的箭头键上移动? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca 我所有的 Firefox 附加组件突然被禁用了,我该如何重新启用它们? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK 是否可以使用文本创建二维码? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 更改 git init 默认分支名称 2019-04-01 06:16:56 +0800 CST

热门标签

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve