(此時網出乎意料

(此時網出乎意料

我試圖在需要時將批次檔寫入映射驅動器,但每當我運行它時,我都會收到錯誤:

(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 會強制輸入正確的回應。

相關內容