Batch file BAT文件存在问题:如果/否则无法按预期工作
我正在尝试制作一个短的BAT文件,但它的一个函数有问题。我尝试了很多不同的方法来做这件事,但似乎没有一种有效,但作为一个初学者,我无法解决这个问题。基本上,脚本在运行时应该检查某个.BAT文件是否存在,如果存在,脚本会询问用户是否要运行该文件。如果用户指示Y,则调用另一个BAT,然后原始脚本继续。如果用户指示N,则脚本应在不调用其他BAT的情况下继续。到目前为止,脚本总是注意到并询问文件,但在提示下选择Y永远不会起作用。我相信解决办法是显而易见的,但我还是逃避了。代码如下:Batch file BAT文件存在问题:如果/否则无法按预期工作,batch-file,Batch File,我正在尝试制作一个短的BAT文件,但它的一个函数有问题。我尝试了很多不同的方法来做这件事,但似乎没有一种有效,但作为一个初学者,我无法解决这个问题。基本上,脚本在运行时应该检查某个.BAT文件是否存在,如果存在,脚本会询问用户是否要运行该文件。如果用户指示Y,则调用另一个BAT,然后原始脚本继续。如果用户指示N,则脚本应在不调用其他BAT的情况下继续。到目前为止,脚本总是注意到并询问文件,但在提示下选择Y永远不会起作用。我相信解决办法是显而易见的,但我还是逃避了。代码如下: SET /P kmn
SET /P kmname=Enter database name:
:kmstart
IF EXIST C:\Visual\area\%kmname%\%kmname%.flt (
ECHO %kmname%.flt found, will now create %kmname%.ive.
CD C:\Visual\area\%kmname%\
IF EXIST Preprocess.bat (
SET /P kmpreproc=Found Preprocess.bat. Do you want to run it now?
IF /I "%kmpreproc%" EQU "Y" (
GOTO PREPROC
) ELSE (
GOTO CONTINUE
)
)
GOTO CONTINUE
) ELSE (
ECHO C:\Visual\area\%kmname%\%kmname%.flt does not exist. Try again.
SET /P kmname=Enter database name:
GOTO kmstart
)
:PREPROC
ECHO Running Preprocess.bat.
:CONTINUE
ECHO Continuing process.
PAUSE
下面是我的更正和整理代码:
@echo off
SET /P kmname=Enter database name:
:kmstart
IF EXIST C:\Visual\area\%kmname%\%kmname%.flt (
ECHO %kmname%.flt found, will now create %kmname%.ive.
CD C:\Visual\area\%kmname%\
IF EXIST Preprocess.bat (
SET /P kmpreproc=Found Preprocess.bat. Do you want to run it now?
IF /I "%kmpreproc%"=="Y" (
GOTO PREPROC
)
GOTO CONTINUE
)
)
ECHO C:\Visual\area\%kmname%\%kmname%.flt does not exist. Try again.
SET /P kmname=Enter database name:
GOTO kmstart
:PREPROC
ECHO Running Preprocess.bat.
call "cmd /c start Preprocess.bat"
pause
:CONTINUE
ECHO Continuing process.
PAUSE
如果不起作用,请尝试在
@echo off
下写入setlocal EnableDelayedExpansion
,并将所有%
替换为
问题在于变量在输入if
之前被评估,这意味着在变量结束之前,cmd不会看到任何更改
这会给您带来问题,因为变量kmprepoc
以及kmname
在if
块中的变化取决于第一个if
结果
修复方法(假定其余代码正常工作)是通过将%
更改为,启用延迟扩展并使用延迟扩展而不是正常扩展代码>在您的变量上
setlocal enabledelayedexpansion
SET /P kmname=Enter database name:
:kmstart
IF EXIST C:\Visual\area\!kmname!\!kmname!.flt (
ECHO !kmname!.flt found, will now create !kmname!.ive.
CD C:\Visual\area\!kmname!\
IF EXIST Preprocess.bat (
SET /P kmpreproc=Found Preprocess.bat. Do you want to run it now?
IF /I "!kmpreproc!" EQU "Y" (
GOTO PREPROC
) ELSE (
GOTO CONTINUE
)
)
GOTO CONTINUE
) ELSE (
ECHO C:\Visual\area\!kmname!\!kmname!.flt does not exist. Try again.
SET /P kmname=Enter database name:
GOTO kmstart
)
:PREPROC
ECHO Running Preprocess.bat.
:CONTINUE
ECHO Continuing process.
PAUSE
您需要对设置的变量使用延迟展开,然后在代码块内部使用(如if
或for
块)。在顶部添加setlocal EnableDelayedExpansion
,然后使用
代替%
表示延迟变量扩展。例如,IF/I“!kmpreproc!”eq“Y”(
。没有时间留下更详细的答案…请尝试在命令行中使用help set
。找到了解决方案。显然是“set/P”按照IF-EXIST操作不正常。我将设置放在自己的部分,并使用IF-EXIST调用GOTO来代替。+1您的解释令人困惑,但看起来您正确诊断了问题并提供了解决方案。谢谢,是的,我知道,我很少留下解释,因为我无法很好地解释:)我通常只会在OP询问的情况下写下它为什么有效。