为什么我的 .bat 文件在第 14 行之后没有错误地退出(在 if 语句之前暂停)?

Why is my .bat file exiting without error after line 14 (pause befor if statement)?

有点尴尬,我的第一个问题是关于一个简单的批处理文件,但我在这方面的知识非常有限。

我正在编写一个简单的批处理脚本来将一些数据从 a 复制到 b。因此我想根据当前月份创建目标文件夹并检查该文件夹是否已存在。

我无法确定为什么我的代码在第 14 行退出而没有在按下某个键后抛出任何东西。我还尝试使用批处理代码验证工具(BatCodeCheck“相当过时”)来验证代码。但是,它不会针对我的问题抛出任何错误或警告。

有问题的代码:

@echo off
echo Getting current month...
set month=%date:~3,2%
if %month:~0,1% == 0 (
    set /A month=%month:~1,2%-1
) ELSE (
    set /A month=%month%-1
)
if [%month:~1,2%] == [] (
    set month=0%month%
)
echo "%month% is the month before"
echo Checking for monthly folder...
pause
if exist %~dp0%month%\ (
    echo "Folder already exists. Press y to overwrite"
    pause
    set /p Input=Overwrite? (y/n):
    if /I "%Input%"NEQ"y" (
        EXIT 0
    )
) ELSE (
    echo "Folder doesn't exist already. Creating..."
    mkdir %~dp0%month%\
)

检查日志:

Time          :  2022-05-12 19:10:08
Program       :  BatCodeCheck, Version 0.38
Arguments     :  D:\RunBackup.bat /L /W
File name     :  "D:\RunBackup.bat"
File date     :  2022-05-12 19:10:02
File encoding :  ASCII
Tests         :  ABELMSUV
                 A =  command line Arguments for batch commands
                 B =  Best practice tips
                 E =  Environment variables
                 L =  Labels
                 M =  common Mistakes
                 S =  verbose Summary (variables, labels, subroutines)
                 U =  Undefined environment variables
                 V =  Vulnerabilities

RISKY CODE:
Line    18: SET /P could make your code vulnerable to exploits (see http://www.robvanderwoude.com/battech_inputvalidation.php#SetP)

SUMMARY:
1   line generated a warning and should be examined


Note that some warnings are only displayed once. Correct the errors and run this test again.

希望这不是我遗漏的语法错误...

当您使用 point-click-and-giggle 方法执行批处理时,如果找到 syntax-error 或脚本 运行 完成,批处理 window 将关闭。您 可以 在语句之后放置一个 pause 并返回错误,但最好从那里 open a 'command prompt' 和 运行 您的批次,以便 window 保持打开状态并显示任何(错误)消息。

我怀疑 if exist %~dp0%month%\ ( 应该被引用 if exist "%~dp0%month%\" ( - 路径可能包含空格。

同样适用于 mkdir - 如果没有引号,每个 space-separated 字符串将被视为要创建的 directory-name。

您的比较语句 "%Input%"NEQ"y" 需要在 neq 的每一侧留出空格。

阅读 了解为什么这不起作用 as-is。有很多关于如何在这种情况下使用 choice 的 SO 文章。