处理包含跨越多行的变量的批处理文件

时间:2013-01-17 17:11:59

标签: batch-file dos

有很多帖子讨论批处理文件中的分割线,但我无法完全满足我的要求。我想要一个包含多组IP列表的属性文件,然后在批处理文件中处理这些列表。所以属性文件是这样的(我不希望列表在一行上,因为可能有很多而单行会使它难以阅读):

IPLIST_1=^
12.34.56.1 ^
21.43.65.2 ^
5.8.001.3

IPLIST_2=^
222.11.33.1 ^
10.1.1.2

和一个类似这样的批处理文件:

setlocal EnableDelayedExpansion
FOR /f "delims=" %%x in (iplists.txt) DO (set "%%x")
FOR %%A IN (%IPLIST_1%) DO (
some stuff
)

但它并没有像我希望的那样工作。如果我有这样的批处理文件,一切都还可以:

FOR %%A IN (^
12.34.56.1 ^
21.43.65.2 ^
5.8.001.3) DO (
some stuff
)

谢谢, 保罗

1 个答案:

答案 0 :(得分:0)

@echo off
set "LIST="
for /f "tokens=1 delims=^^" %%I in (iplists.txt) do (

  setlocal enabledelayedexpansion
  echo %%I | find "IPLIST_" &&  for %%P in (!LIST!) do ( something with %%P ) & (  set "IPLIST_=")
  echo %%I | find "IPLIST_" || ( set "LIST=!LIST! %%I")
  endlocal

)

很难理解你在这里有什么。我的假设是:

  1. 您有文件iplists.txt

  2. 你希望bat能够将每个列表解释为一个整行,但是IP在不同的行上,所以你试图将它们与 ^ 联合起来(实际上这是多变的)< / p>

  3. 您想要处理FOR循环中的每个列表
  4. 上面的代码是我的提议 - 在外部循环中 ^ 被转义 - 你根本不需要它们但它们不会受到伤害。你不能将列表统一在一行中批处理脚本。


    首先我开始逐行读取list.txt。我有一个空列表,最初传递给内部FOR - 但迭代用空格分隔的项目,如果没有这样,它将什么都不做。 setlocal enabledelayedexpansion 是在LIST中对括号内的可见内容进行更改。使用两个echo %%I | find "IPLIST_"我正在执行条件执行。如果行%% I不包含IPLIST_字符串,则将执行第二行,并且将使用下一个IP扩展LIST。如果它包含“IPLIST_”将执行第一行,其中列表将由内部FOR处理并最后删除。然后我们再次开始直到文件结束。