批次處理:子程序中出現意外的變數結果

批次處理:子程序中出現意外的變數結果

一個答案上一個問題建議使用此 FOR 行。現在我正在嘗試使用該變數。我目前的批次腳本:

@echo off
cls
for %%G in ("3D Objects","Documents","Downloads","Music","Pictures","Videos") do call :sub1 %%G
:sub1
echo %%G
set apath=%%~G
echo %apath%
goto :eof
:End

該腳本的輸出是該腳本的七次迭代:

%G
%~G

子例程似乎對變數做了一些事情。因為當我替換這些行時:

for %%G in ("3D Objects","Documents","Downloads","Music","Pictures","Videos") do (
echo %%G
set apath=%%~G
echo %apath%
)

我得到了期望的結果:六對這種性質的輸出:

"3D Objects"
3D Objects

如預期的那樣,波形符刪除了引號。

在第一個程式碼範例中,七對(不是六對)輸出線的產生表明子程式可能會忽略引號,將“3D”和“物件”渲染為兩個單獨的專案 - 這是在上一個問題

我開始修改子程式方法,因為我在使用第二個程式碼範例(上面)中提供的更簡單的方法來實現特定結果時遇到問題。延遲擴張可能會解決這個問題,但代價是增加複雜性。不可否認,子程式的「goto :eof」行也有點令人困惑,即使它確實有效。

我的具體問題是,在子例程中使用該變數時出了什麼問題?但如果有更好的方法,我也希望至少有一個這個方向的連結。

答案1

您正在傳遞的值為了使用循環迭代到子例程稱呼因此,您希望用雙引號將其(傳遞的變數佔位符)括起來,然後在該子例程中引用傳入的變數作為%1%~1刪除封閉的雙引號。

在每個被呼叫子例程的末尾使用GOTO :EOF會將控制權傳回原始呼叫者子例程,以便它可以繼續處理命令後適用的其餘邏輯(如果適用)call

@echo off
cls
for %%G in ("3D Objects","Documents","Downloads","Music","Pictures","Videos") do call :sub1 "%%~G"
goto :eof

:sub1
echo %1
set apath=%~1
echo %apath%
goto :eof
:End

輸出

"3D Objects"
3D Objects
"Documents"
Documents
"Downloads"
Downloads
"Music"
Music
"Pictures"
Pictures
"Videos"
Videos

支持資源

  • 為了
  • 命令列參數(參數)

    參數也可以傳遞給子例程CALL:

    CALL :my_sub 2468

    您可以使用 % 後面接著其在命令列上的數字位置來取得任何參數的值。傳遞的第一項始終為 %1,第二項始終為 %1,%2依此類推

    %*在批次腳本中引用所有參數(例如) ,%1 %2 %3 %4 %5 ...%255只有參數可以透過數字引用。%1%9

  • 稱呼

    透過引用傳遞

    除了在命令列上傳遞數字或字串值之外,還可以傳遞多變的名稱,然後使用該變數在腳本或子例程之間傳輸資料。透過引用傳遞是一種稍微進階的技術,但當字串包含 CMD 分隔符號或引號字元時特別有用。


    呼叫子程式 (:label)

    這個CALL指令將把控制權傳遞給指定標籤以及任何指定參數之後的語句。若要退出子例程,請指定GOTO :eof這會將控制項轉移到目前子例程的末端

  • CALL /?

    CALL command now accepts labels as the target of the CALL.  The syntax
    is:
    
        CALL :label arguments
    
    
    In addition, expansion of batch script argument references (%0, %1,
    etc.) have been changed as follows:
    
    
        %* in a batch script refers to all the arguments (e.g. %1 %2 %3
            %4 %5 ...)
    
        Substitution of batch parameters (%n) has been enhanced.  You can
        now use the following optional syntax:
    
            %~1         - expands %1 removing any surrounding quotes (")
    

相關內容