将多行环境变量拆分为行

时间:2015-03-11 13:25:17

标签: windows batch-file jenkins cmd

我有以下问题: 我在Jenkins服务器上执行一个Windows批处理文件,并且必须将多行环境变量(将víaJenkins参数设置)拆分为单行。每行都是另一个程序的参数列表的一部分:

Jenkins文本框参数:

-foo 224 -bar "Some parameter with spaces"
-foo 225 -bar "another param"

应该导致Jenkins内部的以下调用:

myprog.exe -baz 0 -meow -foo 224 -bar "Some parameter with spaces"
myprog.exe -baz 0 -meow -foo 225 -bar "another param"

我尝试将其与for /F拆分,但没有取得任何成功。搜索没有出现任何有用的东西,我试过的任何东西给了我语法错误或只打印了第一行。

这是我尝试过的事情之一:

for /f "tokens=* delims= " %%f in ("%varname%") do

给我语法错误,因为该变量已包含引号。

echo %varname%

仅输出变量的第一行。

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

FOR / F命令将变量中插入的LF作为行分隔符(这是FOR / F命令的自然行为),因此为了使用FOR / F处理这样的变量,不需要任何额外的操作。 :

@echo off
setlocal EnableDelayedExpansion

rem Create a variable containing line breaks.
set LF=^
%empty line 1/2%
%empty line 2/2%
set "str=The quick brown!LF!fox jumps over!LF!the lazy dog."

set line=0
for /F "delims=" %%a in ("!str!") do (
   set /A line+=1
   echo Line !line!: %%a
)

这里的关键是用!exclamationMarks扩展变量!否则LF将削减%值%。另外,如果您想要用LF分隔的完整行,请使用" delims ="。输出示例:

Line 1: The quick brown
Line 2: fox jumps over
Line 3: the lazy dog.

答案 1 :(得分:0)

作为反射,我建议您使用以下解决方案:

如果安装了python(如果不是......由你来安装它......它很有用;-))

批处理行中的

: Python MyScriptToExecuteEachLinesFromVar.py varname" myprog.exe -baz 0 -meow"

使用脚本内容:

import sys,os  # libraries used : system and operating system

if len(sys.argv)>0:                   # if arguments provided (at least the variable name)
  varname = sys.argv[1]               # the variable name is the second argument (0=script)
  prefix = " ".join(sys.argv[2:])     # the list of all others are the prefix.

  lines = os.environ[varname].split('\n')  # get the var and split lines 

  for f in lines : 
    print "execute:", prefix, f
    os.system(prefix+" "+f)                # execute each line with the given prefix.

希望它有所帮助。

答案 2 :(得分:0)

您可以将echo变量输出到临时txt文件,然后使用for /f循环逐行处理该txt文件。您还应该使用延迟扩展来防止对换行符进行不适当的评估。

@echo off
setlocal enableDelayedExpansion

:: // Test environment.  Create a variable containing line breaks.
set BR=^


:: // note: The two empty lines above are required.
set "str=The quick brown!BR!fox jumps over!BR!the lazy dog."

:: // Test environment ready.
:: // Output to temporary txt file.
>"%temp%\tmp.txt" echo(!str!

:: // Process the txt file line by line.
set "line=0"
for /f "usebackq delims=" %%I in ("%temp%\tmp.txt") do (
    set /a line += 1
    echo Line !line!: %%I
    rem // myprog.exe -baz 0 -meow %%I
)

:: // Delete temporary txt file.
del "%temp%\tmp.txt"

那应该输出

  

第1行:快速棕色

     

第2行:狐狸跳过

     

第3行:懒狗。


或者,如果您更愿意避免使用临时文件,则可以调用另一个运行时将环境变量提供给for /f循环。这是一个JScript混合示例。

@if (@CodeSection == @Batch) @then

@echo off
setlocal enableDelayedExpansion

:: // Test environment.  Create a variable containing line breaks.
set BR=^


:: // note: The two empty lines above are required.
set "str=The quick brown!BR!fox jumps over!BR!the lazy dog."

:: // Test environment ready.
:: // Invoke JScript to read the environment variable and return it line-by-line
set "line=0"
for /f "delims=" %%I in ('cscript /nologo /e:JScript "%~f0"') do (
    set /a line += 1
    echo Line !line!: %%I
)

:: // end main runtime
goto :EOF

@end // JScript portion simply echoes %str% from the context of the current process
WSH.Echo(WSH.CreateObject('WScript.Shell').Environment('PROCESS')('str'));

输出与上述相同。