从 WMIC 查询中排除一些输出
Exclude some outputs from WMIC query
我正在通过 wmic(感谢 Compo)获取 Windows 用户及其本地路径的列表。
我希望在此 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
与您选择的选项一起使用,(刚刚修复).
由于您从我的 中选择的代码不是健壮的代码,它适合具有 spaces/problematic 个字符的用户名,我建议您也更改为该代码。
因此,这将是我的建议答案,(使用 findstr.exe
排除 usernames.txt
中的名称):
@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")
我正在通过 wmic(感谢 Compo)获取 Windows 用户及其本地路径的列表。
我希望在此 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
与您选择的选项一起使用,(刚刚修复).
由于您从我的
因此,这将是我的建议答案,(使用 findstr.exe
排除 usernames.txt
中的名称):
@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")