0

好的,我正在编写一个脚本,该脚本从多个文本文件中提取值,但似乎找不到将文件组合成单个文本文件的好方法。

FOR /f "tokens=%toknum% delims=:" %%G in ('"find /v /c "" "%~dp0\!systype!Win7Updates.txt""') do set maxcnt=%%G

在文本文件中:

KB978601,2010\MS10-019\WinSec-MS10-019-011-P57297-Windows6.1-KB978601-x86.msu,/quiet /norestart

我试图弄清楚如何在文件中创建一个区域,以便将这些东西分开。我想尝试找到标题,转到标题,然后将加载它下面的所有内容。

我正在尝试做的事情的例子。(也尝试在 CSV 文件中执行此操作)所以我希望脚本找到 windows vista 补丁区域并仅加载该区域下方的那些。有谁知道这是否可能?

:Windows 7 Patches
KB978601,2010\MS10-019\WinSec-MS10-019-011-P57297-Windows6.1-KB978601-x86.msu,/quiet /norestart
KB978601,2010\MS10-019\WinSec-MS10-019-011-P57297-Windows6.1-KB978601-x86.msu,/quiet /norestart
KB978601,2010\MS10-019\WinSec-MS10-019-011-P57297-Windows6.1-KB978601-x86.msu,/quiet /norestart
KB978601,2010\MS10-019\WinSec-MS10-019-011-P57297-Windows6.1-KB978601-x86.msu,/quiet /norestart
KB978601,2010\MS10-019\WinSec-MS10-019-011-P57297-Windows6.1-KB978601-x86.msu,/quiet /norestart

:Windows Vista Patches
KB978601,2010\MS10-019\WinSec-MS10-019-011-P57297-Windows6.1-KB978601-x86.msu,/quiet /norestart
KB978601,2010\MS10-019\WinSec-MS10-019-011-P57297-Windows6.1-KB978601-x86.msu,/quiet /norestart
KB978601,2010\MS10-019\WinSec-MS10-019-011-P57297-Windows6.1-KB978601-x86.msu,/quiet /norestart
KB978601,2010\MS10-019\WinSec-MS10-019-011-P57297-Windows6.1-KB978601-x86.msu,/quiet /norestart
KB978601,2010\MS10-019\WinSec-MS10-019-011-P57297-Windows6.1-KB978601-x86.msu,/quiet /norestart
4

1 回答 1

1

您的陈述“将加载它下面的所有内容”不清楚。我假设您的意思是标题下方的所有内容,直到下一个标题。我真的不知道您所说的“已加载”是什么意思-也许将这些行附加到另一个文件中?对于这个解决方案,我将简单地回显这些线条。

您的测试用例非常蹩脚 - 部分内容相同,因此很难判断代码是否正常工作。这是一个更有趣的测试用例,应该更容易解释。我添加了一些!字符来说明使用 FOR 循环时延迟扩展的问题。

测试.txt

:Windows 7 patches
Windows 7 line 1!
Windows 7 line 2!
Windows 7 line 3!

:Windows Vista patches
Windows Vista line 1!
Windows Vista line 2!
Windows Vista line 3!

:Windows XP patches
Windows XP line 1!
Windows XP line 2!
Windows XP line 3!

这是一个批处理脚本,它只回显 Vista 补丁部分。它在循环内打开和关闭延迟扩展以保护!. 如果打开延迟扩展,%%A 的扩展将无法正常工作。

@echo off
setlocal disableDelayedExpansion
for /f "delims=:" %%N in ('findstr /n /c:":Windows Vista patches" test.txt') do set skip=%%N
for /f "skip=%skip% delims=" %%A in (test.txt) do (
  set ln=%%A
  setlocal enableDelayedExpansion
  if "!ln:~0,1!"==":" (endlocal & goto :break)
  endlocal
  echo %%A
)
:break

上述解决方案将删除任何空白行。如果需要,有一些技巧可以保留空白行。;由于默认的 FOR /F "EOL" 选项,它还将删除任何以开头的行。如果需要,还有一些技巧可以解决这个问题。

于 2012-06-20T12:15:06.923 回答