为什么我的 .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 文章。
有点尴尬,我的第一个问题是关于一个简单的批处理文件,但我在这方面的知识非常有限。
我正在编写一个简单的批处理脚本来将一些数据从 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
的每一侧留出空格。
阅读 choice
的 SO 文章。