1

我正在尝试制作一个简短的 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
4

2 回答 2

2

问题是您的变量在进入 's 之前正在被评估if,这意味着 cmd 在它们结束之前不会看到任何更改。

作为变量,这会给您带来问题,kmpreproc并且根据第一个if结果,在块kmname内发生变化。if

修复(假设您的代码的其余部分正在工作)是通过将%'s更改为!变量来启用延迟扩展并使用延迟扩展而不是正常扩展。

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
于 2013-01-04T08:40:48.587 回答
0

下面是我更正和整理的代码:

@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

如果它不起作用,请尝试setlocal EnableDelayedExpansion在下面写入@echo off并将所有内容替换%!.

于 2013-01-04T02:42:49.613 回答