3

複数の SQL スクリプトを Ingres データベースに適用しようとしています (vnode セットアップを使用)。テスト フェーズでは、4 つのデータベースに対して実行する必要があります。この煩わしさをつぼみに挟もうとして、バッチファイルを開始しましたが、上記のエラーが表示されます。見つかった解決策の多くは、バッチ ファイルが開始時にブロック内のすべてを評価することを示唆していますが、木に対して森が表示されません。:1ST と :2ND の部分が問題を引き起こしている疑いがありますが、それらを実行する必要があります。SQL、バッチ、およびコマンド ウィンドウの出力は以下のとおりです。


UPDATE core SET sysflag='O'

@ECHO off
SET VN1=dave
SET DB1=dbtest1
SET DB2=dbtest2
SET SQL1=open.sql
SET SQL2=open.sql

:MENU
CLS
ECHO 1 - Leave
ECHO 2 - Database1
ECHO 3 - Database2

SET /P M=Choose then press ENTER:
IF "%M%"=="1" GOTO EOF
IF "%M%"=="2" GOTO 1ST
IF "%M%"=="3" GOTO 2ND
GOTO MENU

:1ST
SET DATABASE=%VN1%::%DB1%
GOTO RUNSQL
:2ND
SET DATABASE=%VN1%::%DB2%
GOTO RUNSQL

:RUNSQL
ECHO Applying SQLs to %DATABASE%
SQL %DATABASE% < %SQL1% > log_%SQL1%.txt
PAUSE
SQL %DATABASE% < %SQL2% > log_%SQL2%.txt
PAUSE
GOTO MENU

:EOF

C:\Users\me\BUILD>IF UPDATE core SET sysflag='O'==1 GOTO EOF
4

1 に答える 1

1

%M%の値が1、2、または 3 であることを期待していますが、どういうわけか値はUPDATE coreです。左の値の途中にスペースがあるため、IF ステートメントは失敗します。スペースなどのトークン区切り文字はエスケープするか、両側の文字列全体を引用符で囲む必要があります。ステートメントを に変更しIF "%M%"=="1" GOTO EOFてエラーを解消することはできますが、それでも目的の結果は得られません。

SET /P ステートメントは、stdin から値を読み取ります。valueUPDATE coreを入力していないと思いますが、代わりに入力がリダイレクトまたはパイプされました。スクリプトに間違った値を与えています。

入力が 1、2、または 3 でない場合にコードが :1ST に落ちないように、エラー処理を追加する必要があります。


SET /P ステートメントの入力を明示的にコンソールにリダイレクトできます。そうすれば、バッチ スクリプトに提供されたリダイレクトされた入力またはパイプされた入力が無視されます。

<con: SET /P "M=Choose then press ENTER: "

しかし、あなたのデザイン全体に何か問題があるようです。スクリプトの入力をパイプまたはリダイレクトしている場合、ループ内で選択肢の対話型メニューを表示しても意味がありません。ユーザーが 1 を押して終了しない場合はどうなりますか? 最終的には、パイプまたはリダイレクトされた入力が使い果たされ、問題が発生します。

于 2012-08-29T12:36:01.463 に答える