问题描述
无论输入什么,它总是转到第一个翻领
我看到其他帖子也有同样的问题,但他们所犯的语法错误都没有出现在我的脚本中。
这是脚本:
@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}}选项来进行比较不区分大小写 ,例如,无需分别检查/I
和y
。Y
显示更多信息。 -
help if
是一个独立的可执行文件,可以从 任何 (Windows) shell 中调用,所以有 通常没有充分的理由调用PowerShell(tree.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