【问题标题】:Windows batch comma delimited list in for loopfor循环中的Windows批处理逗号分隔列表
【发布时间】:2013-06-20 07:44:20
【问题描述】:

我知道有很多关于 SO 的相关问题,例如 this onethis one,但由于某种原因,到目前为止我无法让其中任何一个工作。

我正在尝试创建一个批处理文件来连续安装多个软件:

这是我的批处理文件

set packages=(7zip.install, ^ :: for compression
notepadplusplus.install, ^ :: file editor
Firefox, ^
putty, ^
mysql -Version 5.5.30, ^
postgresql)

for %%i in %packages% do ( 
::echo %%i
cinst %%i
)

一切正常,但对于 mysql 部分。空格实际上是作为分隔符的,也就是说我得到了

E:\>(echo 7zip.install )
7zip.install

E:\>(echo notepadplusplus.install )
notepadplusplus.install

E:\>(echo Firefox )
Firefox

E:\>(echo putty )
putty

E:\>(echo mysql )
mysql

E:\>(echo -Version )
-Version

E:\>(echo 5.5.30 )
5.5.30

E:\>(echo postgresql )
postgresql

我最想得到的是

E:\>(echo mysql -Version 5.5.30 )
 mysql -Version 5.5.30

诀窍是我想将我的列表保留在脚本顶部,每行一个元素,并且可以插入注释以明确发生的情况。

有没有办法做到这一点?

我更习惯于 linux bash,我必须说我对 windows 符号有点迷茫。

谢谢!

【问题讨论】:

    标签: for-loop batch-file delimiter


    【解决方案1】:

    试试这个:

    @ECHO OFF &setlocal
    
    for %%i in (
        "7zip.install"
        "notepadplusplus.install"
        "Firefox"
        "putty"
        "mysql -Version 5.5.30"
        "postgresql"
            ) do (
        echo %%i
        cinst "%%~i"
    )
    

    【讨论】:

    • 谢谢它确实可以这样工作。为了使其完美,您是否知道是否也可以插入评论?我试过“7zip.install :: comment”,但它并不喜欢它:s
    • 不,括号内不能有注释()REM 也不起作用,都被解释为有效字符串。将您的评论放在for %%i in (之前的行中。
    • 你可以像"7zip.install" %= one comment%一样使用percent cmets。这实际上是未定义变量的变量扩展
    • @jeb 谢谢 - 我不喜欢这个,所以我忘记了 :)
    【解决方案2】:

    虽然有些冗长,但此方法允许您在每一行中插入 cmets:

    set "packages=           7zip.install"                  // for compression
    set "packages=%packages% notepadplusplus.install"       // file editor
    set "packages=%packages% Firefox"
    set "packages=%packages% putty"
    set "packages=%packages% "mysql -Version 5.5.30""       // use nested quotes here
    set "packages=%packages% postgresql"
    
    for %%i in (%packages%) do (
       echo %%~i
       REM cinst "%%~i"
    )
    

    【讨论】:

      【解决方案3】:

      for /F "tokens=*" %%i in %packages%?

      只是 mysql 的例子:

      C:\temp>for /F "tokens=1,2,3,4,5 delims=," %i in ("%packages%") do echo %l
      
      C:\temp>echo mysql -Version 5.5.30
      mysql -Version 5.5.30
      

      但我不得不重写你的 var 定义:

      set packages=7zip.install,notepadplusplus.install,putty,mysql -Version 5.5.30,postgresql
      

      【讨论】:

      • 您的解决方案不打印任何内容:s.
      • "mysql -Version 5.5.30" 需要双引号。
      • 不,对于for /f 循环,cinst "%%~i" 需要双引号,但循环不需要。这会奏效。
      猜你喜欢
      • 2018-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-08
      相关资源
      最近更新 更多