1

短い BAT ファイルを作成しようとしていますが、その機能の 1 つに問題があります。これを行うためにさまざまな方法を試しましたが、どれもうまくいかないようですが、初心者なので問題がわかりません。基本的に、スクリプトは、実行時に特定の .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

問題は、変数がif's に入る前に評価されていることです。つまり、cmd は変数が終了するまで変更を認識しません。

これは変数として問題を引き起こし、最初の結果にkmpreproc応じてブロック内で変化します。ifkmnameif

修正 (コードの残りの部分が機能していると仮定) は、変数%の をに変更することにより、遅延拡張を有効にし、通常の拡張の代わりに遅延拡張を使用することです。!

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 に答える