回答先前的问题建议使用这个 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,第二项始终是,
%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 (")