如何解决从 WMIC 查询中排除一些输出
我正在通过 wmic 获取 Windows 用户及其本地路径的列表(感谢 Compo)。
@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 举报,一经查实,本站将立刻删除。