
必要に応じてマップドライブにバッチファイルを書き込もうとしていますが、実行するたびにエラーが発生します。
(net was unexpected at this time
@echo off
SET /P Site=Which site you want to map please type SITE CODE?
IF %Site% == BPT ( SET /P Drive= C B G?
IF %Driv% == C (net use * \\test1\common)
IF %Driv% == G (net use * \\test1\global)
IF %Drive% == B (net use * \\test1\common && net use * \\test1\global))
答え1
DRIV (対 DRIVE) のスペルミス以外にも、拡張が遅れる問題があります。
IF 構造全体は、コードが実行される前に一度に解析される単一の複合ステートメントとして扱われます。これは、括弧で囲まれたコード ブロックすべてに当てはまります。
パーセント拡張は文が完全に解析される前に行われるため、DRIVEはまだ定義されておらず、2番目のIF文は次のように読み取られます。
IF == C (net use * \\test1\common)
これによって構文エラーが発生することがわかるはずです。
1 つの解決策は、遅延展開を有効にして、!drive!
の代わりにを使用することです%drive%
。こうすることで、ステートメント全体が解析され、各コマンドが実行される直前に変数が展開されます。
@echo off
setlocal enableDelayedExpansion
SET /P Site=Which site you want to map please type SITE CODE?
IF %Site% == BPT (
SET /P Drive= C B G?
IF !Drive! == C net use * \\test1\common
IF !Drive! == G net use * \\test1\global
IF !Drive! == B net use * \\test1\common && net use * \\test1\global
)
もう一つの選択肢は、GOTOまたはCALLを使用して大きな括弧ブロックを削除し、パーセント展開を安全に使用できるようにすることです。
@echo off
SET /P Site=Which site you want to map please type SITE CODE?
IF %Site% neq BPT goto NotBPT
SET /P Drive= C B G?
IF %Drive% == C net use * \\test1\common
IF %Drive% == G net use * \\test1\global
IF %Drive% == B net use * \\test1\common && net use * \\test1\global
:NotBPT
CHOICE
もう 1 つのオプションは、の代わりにを使用しSET /P
、その後 を使用してIF ERRORLEVEL
、変数の拡張を必要とせずに返されたエラー レベルをテストすることです。if errorlevel 3
エラー レベルが 3 以上の場合、 は TRUE になることに注意してください。したがって、IF テストは数値の降順で実行する必要があります。
@echo off
SET /P Site=Which site you want to map please type SITE CODE?
IF %Site% == BPT (
choice /c CBG
if errorlevel 3 (
net use * \\test1\global
) else if errorlevel 2 (
net use * \\test1\common
net use * \\test1\global
) else if errorlevel 1 (
net use * \\test1\common
)
)
SET /P と比較した CHOICE の利点の 1 つは、ユーザーが間違った応答を入力することを心配する必要がないことです。CHOICE は正しい応答を強制します。