此代码循环播放" 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
答案 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