为什么我的 GOTO 语句不起作用批处理

问题描述

无论输入什么,它总是转到第一个翻领

我看到其他帖子也有同样的问题,但他们所犯的语法错误都没有出现在我的脚本中。

这是脚本:

@echo off
cls

cd /d %~dp0

echo "Include files? [Y/N]"

set /p option=

if %option%=="Y" GOTO yes
if %option%=="y" GOTO yes
if %option%=="N" GOTO no
if %option%=="n" GOTO no

:yes
cls
powershell -command "iex \"tree /f\" > \"tree-filed.txt\""
GOTO end

:no
cls
powershell -command "iex \"tree\" > \"tree-folders.txt\""
GOTO end

:end
cls
echo the tree list was created.
pause

我错过了什么?

解决方法

rifteyy's solution 是有效的,但一些背景信息可能会有所帮助:

  • 作为 Squashman 注释,一个 if 条件要么要求双方任一(双)引用不加引号;也就是说,if %option%==y ...if "%option%"=="y" ... 都有效:

    • 双引号形式更健壮因为它还处理带有元字符的值例如 & 正确,但匹配必须精确就存在或不存在空格而言。

    • 相反,只有 未加引号的 形式允许前导和尾随空格;例如如果用户输入 if %option%==y ... 而不仅仅是 y y 仍然有效。

  • 您可以使用if的{​​{1}}选项进行比较不区分大小写 ,例如,无需分别检查 /IyY 显示更多信息。

  • help if 是一个独立的可执行文件,可以从 任何 (Windows) shell 中调用,所以有 通常没有充分的理由调用PowerShelltree.com,这很昂贵),因为您可以直接从批处理文件中调用 powershell.exe - 尽管您可能需要 PowerShell 来控制输出文件的字符编码[1]

    • 顺便说一句:在 PowerShell 中,不需要 tree (Invoke-Expression),should generally be avoided;调用外部可执行文件(例如 iex)的最佳方法基本上与 tree.com 相同(见下文)。

    • 如果您确实需要 PowerShell,请按如下方式调用它,例如:
      cmd.exe

因此,批处理文件的简化版本将如下所示(省略了 powershell -command "tree > tree-folders.txt" 命令):

cls

正如 Stephan 指出的,标准的choice.exe 实用程序提供了一个更简单的提示解决方案

@echo off

cd /d "%~dp0"

:prompt
echo "Include files? [Y/N/Q]"

set /p option=

if /I "%option%"=="y" GOTO yes
if /I "%option%"=="n" GOTO no
if /I "%option%"=="q" GOTO :eof
goto prompt

:yes
tree /f > tree-files.txt
GOTO end

:no
tree > tree-folders.txt
GOTO end

:end
echo the tree list was created.
pause

choice /c ynq /m "Include files?" if %ERRORLEVEL% EQU 1 goto yes if %ERRORLEVEL% EQU 2 goto no goto :eof

  • 默认情况下不区分大小写(使用 choice.exe 区分大小写)

  • 仅接受来自用户的单个输入字符,该字符立即退出提示(不需要 Enter 按键),使用/CS 变量设置为字符在传递给 %ERRORLEVEL%

    的允许字符列表中基于 1 的位置
    • 注意:上面故意使用例如 /C 而不是 if %ERRORLEVEL% EQU 1,因为后者使用 equal-or-greater 逻辑,这需要您 反转分支语句的顺序。
  • 自动验证输入(如果输入无效字符会发出哔哔声)

有关详细信息,请参阅 if ERRORLEVEL 1


[1] 但是,如果命令的输出包含非 ASCII 字符,并且您希望输出重定向(choice /? ) 创建 UTF-16LE(“Unicode”)文件 (Windows PowerShell) 或(无 BOM)UTF-8 文件(PowerShell (Core) v6+)。使用 > 中的 > 会生成 OEM 编码的文件,基于控制台的代码页,通过 cmd.exe 报告。或者,您可以通过 chcp 将控制台代码页切换为(无 BOM)UTF-8,但这不适用于 chcp 65001,因为它太旧而无法支持此代码页。相比之下,例如,它可以处理 tree.com 的输出。

,

IF 语句中也必须使用方括号,如果没有,它会自动执行 IF 语句下的操作。

ctx.guild.id

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...