使用数组中的项目时出现批量问题,其中我将数组项目作为参数传递

问题描述 投票:0回答:1

使用索引变量回显批处理文件数组类似的问题?我似乎无法将项目放入我的数组中。代码:

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"
batch-file
1个回答
0
投票

这里有一个替代方案,仅当您传递 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[
开头的预定义变量。延迟变量扩展仅在需要时启用,保留参数字符串中任何可能的
!
字符。最后两行只是为了向您展示定义的内容。

© www.soinside.com 2019 - 2024. All rights reserved.