1

有很多帖子讨论批处理文件中的拆分行,但我不能完全满足我的要求。我想要一个包含 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
)

谢谢,保罗

4

1 回答 1

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 位于不同的行上,因此您尝试将它们与^结合起来 (实际上这是徒劳的)

  3. 您想在 FOR 循环中处理每个列表

上面的代码是我的提议 - 在外循环中,^被转义 - 你根本不需要它们,但它们不会受到伤害。你不能像在批处理脚本中那样将列表合并在一行中。


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

于 2013-01-18T23:03:27.987 回答