我有一个批处理文件,用于检查我们的几台服务器中是否有用户。从命令:
query user %userID% /server:ServerName
我想在输出到屏幕之前捕获它。有没有办法将输出重定向到变量?
我想要实现的基本要点是这样的——我们遍历我们的服务器:
query user %userID% /server:Server1
query user %userID% /server:Server2
query user %userID% /server:Server3
query user %userID% /server:Server4
我希望它只在服务器上找到该用户时通知我,而不是输出在特定服务器上找不到该用户的消息。
答案1
for /F "tokens=1 delims=" %%i in ('query user %userID% /server:ServerName') do set ans=%%i
如果查询用户输出的行在包含所需数据的行之前,则需要添加skip=n
wheren是您感兴趣的行之前的输出行数。为 指定适当的分隔符"delims="
将允许您对其进行解析。
但是 PowerShell 不是更好的方法吗?
如果输出包含多行有意义的输出,则上述内容将仅提供最后一行的结果。在“do”之后添加延迟变量替换和复合命令(将它们括在 () 中)可以处理这种情况。
或者您可以将输出重定向到文件查询用户 %UserID% /user:ServerN >ServerN.txt,然后使用 for /f 进行解析...
答案2
找出分隔符的最佳方法是将输出通过管道传输到文件并在编辑器中检查输出。可能出现空格。因此,只需确保选项 delims= 位于最后,如果在结束引号前留出空格,则将获得空格作为分隔符。然后,您可能还想指定标记。例如,如果您希望用空格分隔第 1、第 3 和第 4 个字段,则选项将是“tokens=1,3,4 delims=”要访问它们,请将它们从 %%i、%%j 和 %%k 中拉出。