【问题标题】:Windows batch: Remove lines from a merged fileWindows 批处理:从合并文件中删除行
【发布时间】:2013-02-06 20:01:42
【问题描述】:

我目前正在制作一个批处理文件,将 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 留下相关信息。但是,因为这取决于语言,所以这不是一个可行的选择。

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

【问题讨论】:

    标签: windows batch-file


    【解决方案1】:

    编辑

    我最初的答案没有用,但我有另一个想法,只要每个 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
    )
    

    【讨论】:

    • 我明白你的意思,但遗憾的是,所有修补程序都被称为 KB#### 并非如此......提供的示例取自脚本生成的文本,它的字面意思是“[#] file1”。 vista 似乎还会列出修补程序的十六进制值,使事情变得更加复杂。问题是每台电脑上的搜索词都不同,无论是操作系统还是操作系统语言。
    • @shadowmanwkp - 我的第一个答案没有奏效并不奇怪。我还有一个想法。请参阅我的更新答案。
    • 这似乎是魅力:D 似乎之前的信息总是保持相同数量的行,从我测试的结果来看,这个解决方案应该可以在很多电脑上完美运行。非常感谢!
    【解决方案2】:

    我不想弄明白,但您可以根据 systeminfo 的 csv 输出对其进行格式化。

    systeminfo /fo csv > info.csv
    

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

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

    修补程序列是倒数第二列。因此您可以用引号将其拆分,并忽略该字段。里面会有一堆废话,但它仍然是"hotfix, hotfix, hotfix,",所以你可以删除引号中的整个内容。

    如果你问我,批量字符串操作很糟糕。如果这是我,我会用带有字符串库的语言来代替它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-02
      • 1970-01-01
      相关资源
      最近更新 更多