如何使用在FOR循环中调用的子集中设置的变量,具有延迟扩展

时间:2016-01-08 04:15:28

标签: loops variables batch-file

此代码循环播放" Fire"的内容。 PC上的文件夹,包含多个子文件夹。对于每个子文件夹,它运行另一个FOR以查找与平板电脑上的目录匹配。如果没有匹配,则调用子例程:missing以设置有关丢失目录的变量。

当我回到主程序时,我无法回应子中设置的变量。我已经尝试了许多排名!名称[%CNT%]! (加倍/加倍%和!)但不能正确。希望有人能伸出援助之手。

@Echo off
SETLOCAL EnableDelayedExpansion
:main
Set /A CNT=0
    :: Fire folder contains dirs that may have been deleted from tablet. 
    For /F %%G IN ('dir /b %Fire%') DO (
        SET thisdir=%%G
        SET /A CNT+=1
            :: set command that will look for %%G on the tablet
            set cmd="adb shell ls /system/priv-app/!thisdir!"

            :: This loop returns nul if dir exists on device
            For /F "tokens=1* delims=:" %%g in ('!cmd!') do (set _N=%%h)
            If NOT "!_N!"=="" call :missing !thisdir! 

                    :: HERE'S THE PROBLEM: With this syntax I get    "CNT"     "CNT"
                    Echo AFTER THE CALL:        "!name[!CNT!]!"     "!pkg[!CNT!]!"

                    :: this displays:   "pkg[3]]
                    Echo AFTER THE CALL:        "%!name[!CNT!]%!"     [!pkg[!CNT!]!]
    )

:missing
:: Both %CNT% and !CNT! work here
    Set pkg[%CNT%]=%1

:: set friendly name for this dir
If "%1"=="com.name.video" set "name[%CNT%]=Video"
If "%1"=="com.name.games" set "name[%CNT%]=Games"
. . .
    :: THIS WORKS HERE IN THE SUB. HOW TO DISPLAY IN MAIN?                      
    Echo MISSING:       !name[%CNT%]!     (!pkg[%CNT%]!)

    :: Output: MISSING:          Video      (com.name.video)
exit /b

3 个答案:

答案 0 :(得分:1)

在您的第一个AFTER THE CALL行中,您的脚本会尝试评估!name[!,然后评估字符串文字CNT,然后评估!]!,依此类推。由于!name[!!]!都未定义,因此它们评估为空,而您将保留字符串文字CNT。相反,您应该将内部!CNT!转换为百分比表示法,以便它可以与外部延迟变量和平共存。您可以使用for循环完成此操作。

for %%I in ("!CNT!") do echo !name[%%~I]!

...以避免冲突的惊叹号。在第二行AFTER THE CALL行中,您尝试使用%!开始变量,同时使用%!结束变量。使用这种语法时,!必须在外面,而%在内部(或者反之亦然 - 请参阅Result作为示例)。但是因为它在括号内的代码块中,所以无论如何它都不会像你想要的那样工作。你需要延迟扩展。使用我上面描述的for循环。

顺便说一下,不要将那些::伪标签用作括号内的代码块中的注释。请改用rem::会破坏事情。

答案 1 :(得分:1)

要在主循环中显示:

call Echo AFTER THE CALL:  "%%name[!CNT!]%%"     [%%pkg[!CNT!]%%]

我知道你不知道在一个区块中使用::comments并且你的maun会遇到你的子...

答案 2 :(得分:0)

也许你可以试试这个:

@echo off&SetLocal EnableDelayEdexpansion

set "name[1]=something"
set "a=1"

echo !name[%a%]!
rem echo %name[!a!]%
call echo !name[%a%]!
call echo %%name[!a!]%%
call echo %%name[%a%]%%
for %%a in (!a!) do (echo !name[%%a]!)

pause