Windows批处理延迟扩展索引



我正在编写一个批处理脚本,通过"query user"命令返回登录的用户。然而,我遇到了其他线程无法帮助我解决的困难。以下是我(几乎(的整个脚本,为了简洁起见,只在结尾处缺少了一些回声:

@ECHO OFF
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
SET me=%~n0
SET parent=%~dp0
SET count=1
FOR /F "skip=1 tokens=* USEBACKQ" %%F IN (`query user`) DO (
::obtain line of output
SET var!count!=%%F 
::obtain first character from line
CALL SET ^faf=^%%var!count!:~0,1%%
::testing purposes
CALL ECHO count:^!count! faf1:^!faf!
::remove the '>' character, if present
IF ^!faf! == ^> ( 
SET var!count!=!var%count%:~1! && ECHO success )
SET /a count=!count!+1
)

它应该做的是获得几行输出中的一行,创建一个临时变量"faf",存储该行的第一个字符,然后将其与">"字符进行比较,"查询用户"总是在当前用户名之前添加该字符。如果检测到该字符,则会覆盖变量,省略第一个字符。同时,echo会打印循环计数器的当前值和临时变量
问题在于CALL SET命令:它似乎忽略了包含">"字符的行,而对于其他行,它可以按预期工作。因此,IF永远不会被使用,echo会打印计数器,但不会打印">"行的第一个字符
请注意,行仍然存储在var1-6中,用"^"打印出来表明即使是用">"打印出来的行也很好。唯一的问题是检测并忽略那个该死的尖括号。有人能帮我吗?我错过了什么?

使用FOR /F命令的DELIMS选项从输出中删除>

@ECHO OFF
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
SET me=%~n0
SET parent=%~dp0
SET count=1
FOR /F "skip=1 tokens=* USEBACKQ delims=>" %%F IN (`query user`) DO (
SET var!count!=%%F
SET /a count+=1
)

我不知道你为什么要这样做,因为你可以简单地用delims选项删除>

因此,我假设您的意图是获得当前登录用户的列表,然后使用>来识别其中的当前用户。

如果是这样的话,那么你可以用下面的代码来实现你的目标

此外,您永远不应该在带括号的块中使用::注释样式。请参阅在批处理文件中应使用哪种注释样式?了解更多相关信息。

@ECHO OFF
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
SET "me=%~n0"
SET "parent=%~dp0"
SET "count=0"
FOR /F "skip=1 tokens=* USEBACKQ" %%F IN (`query user`) DO (
REM Never use this(::) commenting style inside a parenthesized block
REM Use REM or use %= This commenting style =% instead
%= Variable names can not start with equal sign(=) so this can be safely used as a comment =%
SET /a "count+=1"
REM obtain line of output
SET "var!count!=%%F"
REM obtain first character from line
FOR %%A IN (!count!) DO SET "faf=!var%%A:~0,1!"
REM testing purposes
ECHO count:!count! faf1:!faf!
REM remove the '>' character, if present
IF "!faf!"==">" FOR %%A IN (!count!) DO (
SET "var!count!=!var%%A:~1!"
ECHO Success
SET "CurrentUserInfo=!var%%A!"
SET /a "CurrentUserIndex=count"
ECHO Current User Info [Inside Loop - By Index]: !var%%A!
REM Prints a new line
ECHO, 
)
)
ECHO,
ECHO Current User Info [Outside Loop - By Index]:   !var%CurrentUserIndex%!
ECHO Current User Info [Outside Loop - By VarName]: %CurrentUserInfo%
ECHO,
ECHO Printing list of all users by index...
FOR /L %%A IN (1,1,!count!) DO ECHO var%%A: !var%%A!
ECHO,
ECHO Current User is stored in var%CurrentUserIndex%

PAUSE

最新更新