如果我以这种方式使用这些命令,它会做它应该做的事情:
如果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 都不是,它会继续进入一般菜单。
您的批处理文件自上而下执行。
在第二个示例中,即使设置了
foo2
orfoo1
,它也总是会转到: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。所以,我们像这样嵌套或链接它们:
这就是说,如果 foo1 没有设置,那么如果 foo2 没有设置 goto :another_menu
或者,更容易的是,如果 foo1 AND foo2 未设置转到 another_menu
通过使用 findstr 可以稍微简化您的逻辑
逻辑: Findstr 将字符串
%foo%
与 bar1 和 bar2 进行比较。如果匹配,则命令成功完成,条件运算符&&
执行以下命令。如果不匹配,||
则触发条件运算符执行以下命令,因为前面的命令没有成功执行。例子:
您已经检查了
bar1
和bar2
。所以没有必要再次检查它bar1
是否bar2
不是(当代码流到达这一点时它肯定不是,因为你已经在其他地方分支了它)。您可能需要考虑使用
/i
switch withif
来忽略大小写(
if "foo"=="FOO"
为假,if /i "foo"=="FOO"
为真)