微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从 WMIC 查询中排除一些输出

如何解决从 WMIC 查询中排除一些输出

我正在通过 wmic 获取 Windows 用户及其本地路径的列表(感谢 Compo)。

我希望从 wmic 命令的输出中排除一些用户名

@For /F "Skip=1Tokens=1,2" %%G In ('%__AppDir__%wbem\WMIC.exe UserAccount Where^
 "LocalAccount='True' And Not Name Like '[_]%%'" Get Name^,SID 2^>Nul'
)Do @For /F %%I In ("%%H")Do @For /F "Tokens=2Delims==" %%J In ('
 %__AppDir__%wbem\WMIC.exe Path Win32_UserProfile Where^
 "SID='%%I' And Special!='True'" Get LocalPath /Value 2^>Nul'
)Do @For /F "Tokens=*" %%K In ("%%J")Do @Echo User name:"%%G",Profile path:"%%K"

我不确定如何添加此排除文件

%__AppDir__%findstr.exe /V /X / L/ /I G:"usernames.txt"

你能帮我吗?

谢谢

解决方法

如果您打算从输出中排除名称,那么提高效率的一般规则是尽快在代码中过滤您的命令。

因此,最有效的方法是在 Where 子句中进行个别排除。我在我的评论中提供了一个如何做到这一点的例子,例如将对以下划线开头的名称 (And Not Name Like '[_]%%') 的当前排除更改为 And Name!='Dimitri' And Name!='Kalinda' And Name!='Peter'

如果您有一个文件中每行一个的排除列表,并且有太多要转移到 Where 子句中,那么您应该在该首字母的 Do 部分执行过滤For 循环。那时您可以将 findstr.exe 与您选择的选项一起使用,(刚刚修复)

由于您从我的 original answer 中选择的代码不是健壮的,它迎合了带有空格/有问题字符的用户名,我建议您也更改为。

出于这个原因,这将是我建议的答案,(使用 usernames.txt 排除 findstr.exe 内的名称)

@For /F Tokens^=4Delims^=^" %%G In ('%SystemRoot%\System32\wbem\WMIC.exe
 UserAccount Where "LocalAccount='TRUE'" Assoc:List /ResultRole:SID 2^>NUL'
)Do @Set /P "=%%G"<NUL|%SystemRoot%\System32\findstr.exe /XVLIG:"usernames.txt"^
 >NUL&&(For /F "Tokens=1*Delims==" %%H In ('%SystemRoot%\System32\wbem\WMIC.exe
     UserAccount Where "Name='%%G'" Get SID /Value 2^>NUL
     ^|%SystemRoot%\System32\find.exe "="')Do @For %%J In (%%I
    )Do @For /F "Tokens=1*Delims==" %%K In ('%SystemRoot%\System32\wbem\WMIC.exe
     Path Win32_UserProfile Where (SID^="%%J" And Special!^="TRUE" And LocalPath
     Is Not Null^) Get LocalPath /Value 2^>NUL^|%SystemRoot%\System32\find.exe
     "="')Do @For /F Tokens^=* %%M In ("%%L"
     )Do @Echo UserName:"%%G",UserProfile:"%%M")

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。