Windows批处理:从合并文件中删除行

时间:2013-02-05 16:05:10

标签: windows batch-file

我目前正在制作一个批处理文件,它将systeminfo的输出和ipconfig:

合并
@ECHO OFF
pause
systeminfo > "%computername% SystemInfo.txt"
ipconfig >> "%computername% SystemInfo.txt"
"%computername% systeminfo.txt"

代码运行良好,很好,据我所知,也独立于操作系统版本和操作系统语言。但我的问题在于systeminfo转储。它列出了运行在机器上的所有100多个修补程序,使得txt文件几乎不可读:

<useful info>
[01]: File 1
[02]: File 1
[03]: File 1
[04]: File 1
....
[150]: file 1
etc...
<useful info>

还有另一个问题,即此批处理文件必须在运行荷兰语窗口或英语窗口的计算机上运行,​​这意味着我无法对单词进行过滤,因为这些修补程序和单词在每台计算机上都会有所不同。任何人对这个问题都有很好的解决方法。

注意:我已经看到它以相反的方式解决了,只使用findstr留下相关信息。但是,因为这取决于语言,所以它不是一个可行的选择。

编辑:修补程序在不同的OS上也有不同的命名,这意味着我无法对这些修补程序进行过滤。示例:在我测试的XP SP3上,大多数列表都会受到vista上名为“[##] file1”的修补程序的影响,但是,您会在列表中看到十六进制值。

2 个答案:

答案 0 :(得分:3)

修改

我的原始答案没有用,但我有另一个想法,只要每个systeminfo标题的数量和顺序是一致的。我依赖的事实是Hotfix(s):始终是第31个标题。

@echo off
setlocal enableDelayedExpansion
>systemInfo.txt (
  set cnt=0
  for /f "delims=" %%A in ('systeminfo') do (
    set "ln=%%A"
    if "!ln:~0,1!"==" " (if !cnt! neq 31 echo !ln!) else (
      echo !ln!
      set /a cnt+=1
    )
  )
  ipconfig
)

如果标题的数量和/或顺序可以改变,那么我看不出如何有解决方案,除了咬住子弹并寻找特定的标题文本,占用你需要的所有语言支持。

原始答案错误

我不知道这有多可靠。它在我的机器上适用于我,但如果在某些机器上它会剥离不应该的东西,那就不会让我感到惊讶。

>systemInfo.txt (
  systeminfo|findstr /vxrc:"                           \[[0-9]*\]: [^ ]*"
  ipconfig
)

我的所有修补程序都以KB开头,后跟一串数字。如果这总是如此,则上述内容可以改进为:

>systemInfo.txt (
  systeminfo|findstr /vxrc:"                           \[[0-9]*\]: KB[0-9]*"
  ipconfig
)

答案 1 :(得分:0)

我不想弄清楚,但你可以根据systeminfo的csv输出格式化它。

systeminfo /fo csv > info.csv

任何语言的输出基本上都是:

(headers)"<col>", "<col>", "<col>" <...> "<col>"<newline>
(data)"<col>", "<col>", "<col>" <...> "<col>"

修补程序列是倒数第二列。所以你可以用引号拆分它,并忽略那个字段。它会有一堆废话,但它仍然是"hotfix, hotfix, hotfix,"所以你可以用引号删除整个东西。

如果你问我,批处理字符串操作很糟糕。如果这是我,我会用一个带字符串库的语言来做,然后调用它。