Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file BAT文件存在问题:如果/否则无法按预期工作_Batch File - Fatal编程技术网

Batch file BAT文件存在问题:如果/否则无法按预期工作

Batch file BAT文件存在问题:如果/否则无法按预期工作,batch-file,Batch File,我正在尝试制作一个短的BAT文件,但它的一个函数有问题。我尝试了很多不同的方法来做这件事,但似乎没有一种有效,但作为一个初学者,我无法解决这个问题。基本上,脚本在运行时应该检查某个.BAT文件是否存在,如果存在,脚本会询问用户是否要运行该文件。如果用户指示Y,则调用另一个BAT,然后原始脚本继续。如果用户指示N,则脚本应在不调用其他BAT的情况下继续。到目前为止,脚本总是注意到并询问文件,但在提示下选择Y永远不会起作用。我相信解决办法是显而易见的,但我还是逃避了。代码如下: SET /P kmn

我正在尝试制作一个短的BAT文件,但它的一个函数有问题。我尝试了很多不同的方法来做这件事,但似乎没有一种有效,但作为一个初学者,我无法解决这个问题。基本上,脚本在运行时应该检查某个.BAT文件是否存在,如果存在,脚本会询问用户是否要运行该文件。如果用户指示Y,则调用另一个BAT,然后原始脚本继续。如果用户指示N,则脚本应在不调用其他BAT的情况下继续。到目前为止,脚本总是注意到并询问文件,但在提示下选择Y永远不会起作用。我相信解决办法是显而易见的,但我还是逃避了。代码如下:

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询问的情况下写下它为什么有效。