与使用索引变量回显批处理文件数组类似的问题?我似乎无法将项目放入我的数组中。代码:
setlocal enabledelayedexpansion
set /A i=0
for %%X in (%*) do (
set /A i+=1
echo i=!i!
echo %%X
if !i!==1 (
set rootpath=%%~X
) else if !i!==2 (
set Manifest=%%~X
) else (
set Environments[!i! - 2]=%%X
)
)
当我尝试使用环境数组时,它显示为空白。
对于我的第三个和第四个参数,我传递“服务器,数据库”组合,因此输出是:
...
i=3
"server1,db1"
i=4
"server2,db2"
...
当我尝试回应时说:
echo E1=!Environments[1]!
或
echo E1=%Environments[1]%
两者都返回空白:
E1=
我的代码哪里出了问题。 我期待着:
E1="server1,db1"
这里有一个替代方案,仅当您传递 every 参数双引号时才有效,正如您应该的那样。
@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion
If "%~3" == "" Exit /B
Set "rootpath=%~1"
Set "Manifest=%~2"
For /F "Delims==" %%G In ('(Set Environments[^) 2^>NUL') Do Set "%%G="
Set "i=0"
For /F Tokens^=^4^,*^ Delims^=^" %%G In (%*) Do For %%I In ("%%~H") Do (Set /A i += 1
SetLocal EnableDelayedExpansion
For %%J In (!i!) Do (EndLocal
Set "Environments[%%J]=%%~I"))
Set Environments[
Pause
本质上它的作用是,它适用于第二个之后的所有参数,(因此第三个参数成为第一个),这样做意味着不需要额外的计算。
您会注意到,如果至少未传递三个参数,第三行就会退出脚本。第六行确保不存在以字符串
Environments[
开头的预定义变量。延迟变量扩展仅在需要时启用,保留参数字符串中任何可能的 !
字符。最后两行只是为了向您展示定义的内容。