1

所以当我运行这段代码时:

@echo off
setlocal enabledelayedexpansion

set lstFolders= First Second 

set intCounter=0
for %%i in (!lstFolders!) do (
    set /a intCounter += 1
    set strFlder=%%i
    set strFolder!intCounter!=!strFlder!
    echo %%i
    echo !strFlder!
    echo !strFolder%intCounter%!
    echo !strFolder1!
    echo !strFolder2!
)

:End
pause
endlocal

结果是这样的:

First
First
ECHO is off.
First
ECHO is off.
Second
Second
ECHO is off.
First
Second

为什么它不允许我使用以下格式回显变量创建:!strFolder%intCounter%!?是否有另一种方法来引用此变量并获取其中的数据?

4

2 回答 2

1

正如@mklement0 已经说过的,您需要一个额外的评估步骤。
但是尽管使用echo "%%strFolder!intCounter!%%",我还是建议延迟扩展。
由于延迟扩展不受任何内容的影响,echo "%%strFolder...因此会因包含引号或感叹号的内容而失败。

@echo off
setlocal enabledelayedexpansion

set "lstFolders=First Second"

set intCounter=0
for %%i in (!lstFolders!) do (
    set /a intCounter+= 1
    set "strFlder=%%i"
    set "strFolder!intCounter!=!strFlder!"
    echo !strFlder!
    set "varname=strFolder!intCounter!"
    for /F "delims=" %%A in (""!varname!"") do echo Indirect %%~A=!%%~A!
)

双引号避免了 FOR/F 循环的 eol 字符的问题。

于 2016-08-12T07:15:28.453 回答
0

警告:下面的代码仅适用于列表值(%lstFolders%例如的标记First):

  • 不包含空格
  • 也没有以下任何字符:& | < > "

需要一种不同的循环方法来处理这种情况。

@echo off
setlocal enabledelayedexpansion

set "lstFolders=First Second" 

set intCounter=0
for %%i in (%lstFolders%) do (
      rem Increment the counter
    set /a intCounter += 1
      rem Echo the loop variable
    echo #!intCounter!=%%i
      rem Set variable strFolder<intCounter> to the loop variable's value
    set "strFolder!intCounter!=%%i"
      rem Echo the variable created using variable indirection with for /f ('...')
    for /f "delims=" %%v in ('echo "%%strFolder!intCounter!%%"') do set "thisFolder=%%~v"
    echo %%thisFolder%% ^(via %%strFolder!intCounter!%%^)=!thisFolder!
)

运行上述产生:

#1=First
%thisFolder% (via %strFolder1%)=First
#2=Second
%thisFolder% (via %strFolder2%)=Second

您正在寻找的是可变间接

  • 虽然您可以间接设置变量(通过您从另一个变量的值动态构造的名称),例如,
    • set "strFolder!intCounter!=%%i",!intCounter!值为1, 正确地将变量设置strFolder1%%i),
  • 无法以这种方式获得变量的值;你需要一个额外的评估步骤,它for /f ... ('echo ...')可以提供。

    • for /f "delims=" %%v in ('echo "%%strFolder!intCounter!%%"') do ...用单引号 ( ) 解析命令的输出,echo ...并将结果作为一个整体 ( delims=) 分配给变量%%v
      %%~v删除包含在参数周围的双引号,echo以使命令正确处理 shell 元字符等& | < >)。

    • %%strFolder!intCounter!%% 立即评估strFolder!intCounter!strFolder1, if !intCounter!is 1,由于封闭的double %实例,最终结果为literal %strFolder1%,这是echo命令在命令运行时看到的内容for,导致它评估变量引用并扩展为它的值。

于 2016-08-12T03:16:04.333 回答