
一個答案上一個問題建議使用此 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 (")