从 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")