【问题标题】:How can I use a delimiter in wmic output, separating columns?如何在 wmic 输出中使用分隔符来分隔列?
【发布时间】:2012-08-30 07:14:42
【问题描述】:

我想获取某种格式的 Windows 修补程序列表,其输出可以用一些分隔符分隔。到目前为止,我找到了一个 wmic 命令,它给了我想要的输出,但问题是 \s 分隔符在这里不起作用。有没有办法我可以放置一些 , 或任何其他字符,以后可以在 java 程序中使用它们来获取单个列?

命令

wmic qfe get caption,csname,description,hotfixid,installedby,installedon

输出

Caption                                        CSName    Description      HotFixID   InstalledBy          InstalledOn
http://go.microsoft.com/fwlink/?LinkId=161784  Abhishek  Update           KB971033   NT AUTHORITY\SYSTEM  3/15/2012
http://support.microsoft.com/?kbid=2032276     Abhishek  Security Update  KB2032276  NT AUTHORITY\SYSTEM  3/15/2012
..
.

更新

我在努力

for /f "tokens=1,2,3,4,5,6,7,8,9,10,11" %g in ('wmic qfe get caption,csname,description,fixcomments,hotfixid,installdate,installedby,installedon,name,servicepackineffect,status') do @echo %g,%h,%i,%j,%k,%l,%m,%n,%o,%p

但它给了我无效的 GET 表达式

C:\Users\Abhishek\Desktop>for /f "tokens=1,2,3,4,5,6,7,8,9,10,11" %g in ('wmic qfe get caption,csname,description,fixcomments,hotfixid,installdate,installedby,installedon,name,servicepackineffect,status') do @echo %g,%h,%i,%j,%k,%l,%m,%n,%o,%p
Invalid GET Expression.

这里有什么问题?这可能会为我解决问题。

更多更新

我什至尝试了以下命令,但这也不能解决空间问题

命令

for /f "tokens=1,2,3,4,5,6,7,8,9,10,11" %g in ('wmic qfe list') do @echo %g,%h,%i,%j,%k,%l,%m,%n,%o,%p

输出

Caption,CSName,Description,FixComments,HotFixID,InstallDate,InstalledBy,InstalledOn,Name,ServicePackInEffect
http://go.microsoft.com/fwlink/?LinkId=161784,Abhishek,Update,KB971033,NT,AUTHOR,,Y\SYSTEM,3/15/2012,
http://support.microsoft.com/?kbid=2281679,Abhishek,Security,Update,KB2281679,NT,AUTHORITY\SYSTEM,3/15/2012,
http://support.microsoft.com/?kbid=2284742,Abhishek,Update,KB2284742,NT,AUTHORIT,,SYSTEM,3/15/2012,
http://support.microsoft.com/?kbid=2286198,Abhishek,Security,Update,KB2286198,NT,AUTHORITY\SYSTEM,3/15/2012,

【问题讨论】:

    标签: java windows windows-7 groovy wmic


    【解决方案1】:

    正如我在 wmic 的结果中看到的那样,列至少2 个空格隔开。

    Caption                                        CSName    Description      HotFixID   InstalledBy          InstalledOn
    http://go.microsoft.com/fwlink/?LinkId=161784  Abhishek  Update           KB971033   NT AUTHORITY\SYSTEM  3/15/2012
    http://support.microsoft.com/?kbid=2032276     Abhishek  Security Update  KB2032276  NT AUTHORITY\SYSTEM  3/15/2012
    

    所以这可以通过使用\s{2,} 正则表达式在 Java 中轻松解析:

    String result = "...";
    for (String line : result.split("\n")) {
         System.out.println("-> " + line);
         for (String column : line.split("\\s{2,}")) {
             System.out.println("  => [" + column.trim() + "]");
         }
     }
    

    输出:

    -> Caption                                        CSName    Description      HotFixID   InstalledBy          InstalledOn
      => [Caption]
      => [CSName]
      => [Description]
      => [HotFixID]
      => [InstalledBy]
      => [InstalledOn]
    -> http://go.microsoft.com/fwlink/?LinkId=161784  Abhishek  Update           KB971033   NT AUTHORITY\SYSTEM  3/15/2012
      => [http://go.microsoft.com/fwlink/?LinkId=161784]
      => [Abhishek]
      => [Update]
      => [KB971033]
      => [NT AUTHORITY\SYSTEM]
      => [3/15/2012]
    -> http://support.microsoft.com/?kbid=2032276     Abhishek  Security Update  KB2032276  NT AUTHORITY\SYSTEM  3/15/2012
      => [http://support.microsoft.com/?kbid=2032276]
      => [Abhishek]
      => [Security Update]
      => [KB2032276]
      => [NT AUTHORITY\SYSTEM]
      => [3/15/2012]
    

    对于批处理方面,我无法为您提供帮助,因为我对此一无所知:-)

    编辑: 显然,wmic 有一个开关 /format:csv,它应该生成一个 CSV,您也可以轻松地用 Java 解析它。我无法让它在我的机器上运行,但值得关注。

    【讨论】:

    • 如果列之间只有1个空格,问题可能仍然存在:(
    • 是的,但您的示例中并非如此。此外,柱子突然只隔一个空格会很奇怪,不是吗?我找不到关于这个命令的输出格式的任何信息,所以我帮不了你太多。这应该在实践中起作用
    • 查看我的编辑,显然 wmic 有一个开关 /format
    • 我在我的问题中更新了一个类似的命令,认为它可能会帮助其他人帮助我。你也可以看看。另外我不想创建文件,因为它将在客户机器上使用
    • "/format:csv" 有帮助。 wmic qfe list full /format:csv 谢谢
    【解决方案2】:

    我最近为这类事情做了一些事情,并设法让它使用以下语法。下面是一个代码sn-p。

    FOR /F "tokens=1,2,3,4,5,6,7,8 delims=," %%a IN ('WMIC /NODE:"%PCNAME%" PRODUCT GET 
    IDENTIFYINGNUMBER^,INSTALLSOURCE^,NAME^,PACKAGECACHE^,PACKAGENAME^,VENDOR^,VERSION 
    /FORMAT:CSV') DO (
     SET ELE1=%%a
     SET ELE2=%%b
     SET ELE3=%%c
     SET ELE4=%%d
     SET ELE5=%%e
     SET ELE6=%%f
     SET ELE7=%%g
     SET ELE8=%%h
     CALL :CheckIt
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-27
      • 2018-02-22
      • 1970-01-01
      • 2019-07-12
      • 1970-01-01
      • 2019-10-09
      • 2022-01-22
      • 1970-01-01
      相关资源
      最近更新 更多