首页 > 解决方案 > Windows Batch - 延迟扩展索引

问题描述

我正在编写一个批处理脚本,通过“查询用户”命令返回登录用户。但是,我遇到了这里的其他线程无法帮助我解决的困难。这是我的(几乎)整个脚本,为简洁起见,最后只缺少一些回声:

@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 打印循环计数器的当前值和 temp 变量。
问题在于 CALL SET 命令:它似乎忽略了包含“>”字符的行,对于其他行它按预期工作。因此,IF 永远不会被使用,并且 echo 打印计数器,但不是第一个字符 - 对于“>”行。
请注意,这些行仍然存储在 var1-6 中,用“^”打印出来表明即使是带有“>”的行也打印得很好。唯一的问题是检测并忽略那个该死的尖括号。有人可以帮我解决这个问题吗?我错过了什么?

标签: batch-file

解决方案


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

@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
)

推荐阅读