【问题标题】:Windows Batch - delayed expansion indexingWindows Batch - 延迟扩展索引
【发布时间】:2018-07-19 14:58:14
【问题描述】:

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

@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 中,用“^”打印出来表明即使是带有“>”的行也打印得很好。唯一的问题是检测并忽略那个该死的尖括号。有人可以帮我解决这个问题吗?我错过了什么?

【问题讨论】:

  • 根据您的需要,您可能会发现以下方法很有用,@For /F Tokens^=4Delims^=^" %%A In ('WMIC Path Win32_LoggedOnUser') Do @Echo=%%A

标签: batch-file


【解决方案1】:

使用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 选项。
【解决方案2】:

我不确定您为什么要按照您的方式进行操作,因为您可以使用 delims 选项简单地删除 >

所以我假设您的意图是获取当前登录用户的列表,然后使用> 在其中识别当前用户。

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

你也不应该在带括号的块中使用:: 注释样式。有关更多信息,请参阅Which comment style should I use in batch files?

@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

【讨论】:

  • 非常有用,谢谢!我只想删除>,而不是将其用于任何用途,但无论如何我都感谢您的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-21
  • 2019-03-01
  • 2022-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多