Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file Windows批处理延迟扩展索引_Batch File - Fatal编程技术网

Batch file Windows批处理延迟扩展索引

Batch file Windows批处理延迟扩展索引,batch-file,Batch File,我正在编写一个批处理脚本,通过“查询用户”命令返回登录用户。然而,我遇到了一个其他线程无法帮助我的困难。以下是我(几乎)的整个脚本,为了简洁起见,最后只遗漏了一些回音: @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 (

我正在编写一个批处理脚本,通过“查询用户”命令返回登录用户。然而,我遇到了一个其他线程无法帮助我的困难。以下是我(几乎)的整个脚本,为了简洁起见,最后只遗漏了一些回音:

@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变量。
问题在于调用集命令:它似乎忽略了包含“>”字符的行,对于其他行,它可以按预期工作。因此,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

根据您的需要,您可能会发现以下方法非常有用,
@For/F Tokens^=4Delims^=^“%%A In('WMIC Path Win32\u LoggedOnUser'))Do@Echo=%%A
完美的答案,谢谢!出于某种原因,我完全错过了
DELIMS
选项。非常有用,谢谢!我只想删除
,不想用它做任何事,但无论如何我感谢你的回答。