
我試圖在需要時將批次檔寫入映射驅動器,但每當我運行它時,我都會收到錯誤:
(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 尚未定義,並且您的第二個 IF 語句被讀取為
IF == C (net use * \\test1\common)
您應該能夠看到這如何導致語法錯誤。
一種解決方案是啟用延遲擴展和使用,!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
而不是SET /P
然後使用IF ERRORLEVEL
來測試返回的錯誤級別,而不需要變數擴展。請注意,if errorlevel 3
如果錯誤等級大於或等於 3,則為 TRUE。
@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
)
)
CHOICE 相對於 SET /P 的優點之一是您不必擔心使用者輸入錯誤的回應 - CHOICE 會強制輸入正確的回應。