0

我知道打破嵌套循环相当容易,但是,当我使用多个服务器列表时,我不确定如何去做。这是场景:

目标:在与特定用户 ID 匹配的服务器上搜索会话,并终止找到的任何断开连接的会话

问题:我有多个农场列表。我想循环浏览列表,直到找到用户会话,然后在该列表完成时停止(在会话清除时不停止,他们可能在场中有多个会话)。

Farmlist1.txt farmlist2.txt farmlist3.txt

如果在farmlist2.txt 中找到会话,我想在该列表中完成搜索,但不要继续farmlist3.txt。

这是我到目前为止所拥有的,它就像一个魅力。(欢迎优化)

@echo off
echoCitrix Session Reset
echo.
echo This will look for a specific userID AND kill disconnected sessions on     all servers!
set /p userid=User ID of the user: 
for %%a in (q:\scripts\1common\citrixlists\*.txt) do (
for /f "tokens=*" %%l in (%%a) do (
ping %%l -n 1 | find /i "TTL=" > nul 
if errorlevel 1 (
echo server %%l down or out of Load
) else (
echo Looking for %username% and killing disconnected sessions on %%l

for /f "tokens=3" %%b in ('qwinsta *tcp /server:%%l ^| find /i "%userid%"') do echo %%b | rwinsta %%b /server:%%l && echo SESSION FOR %userid% KILLED ON %%l

for /f "tokens=2" %%i IN ('qwinsta /server:%%l ^| find /i "disc"') DO (
if %%i gtr 0 (
rwinsta %%i /server:%%l && echo Disconnected sessions terminated
)

)

)

)

)   
4

1 回答 1

0

我不完全了解您要完成的工作,但我确实了解如何跳出嵌套for循环(或任何其他嵌套的带括号的代码块)。所以让我详细说明一下。

打破单个for循环很简单:放入goto :STOP循环和循环结构后面的行中的标签:STOP。下面的示例根据循环计数器值中断循环:

@echo off
for /L %%I in (0,1,5) do (
    if %%I GTR 3 (
        echo Break!
        goto :STOP
    )
    echo %%I
)
:STOP

尽管指定循环计数到5,但输出为:

0
1
2
3
Break!

请注意,循环实际上在内部完成了计数,但不再执行任何命令。当您将最终值5增加到一个巨大的数字(例如1000000.


但现在让我们专注于嵌套循环(每个示例两个):

  1. 以下代码片段在满足特定条件时中断两个循环:

    @echo off
    for %%J in (Aa Bb Cc) do (
        for /L %%I in (0,1,5) do (
            if "%%~J"=="Bb" if %%I GTR 3 (
                echo Break!
                goto :STOP
            )
            echo %%J-%%I
        )
    )
    :STOP
    

    输出是:

    Aa-0
    Aa-1
    Aa-2
    Aa-3
    Aa-4
    Aa-5
    Bb-0
    Bb-1
    Bb-2
    Bb-3
    Break!
    

    如您所见,循环构造的执行在某个点立即中断。

  2. 当满足内循环中的某个条件时,此处的批处理文件会中断外循环。使用变量将检查结果传输到外部循环FLAG

    @echo off
    set "FLAG="
    for %%J in (Aa Bb Cc) do (
        for /L %%I in (0,1,5) do (
            if "%%~J"=="Bb" if %%I GTR 3 (
                echo Break!
                set "FLAG=#"
            )
            echo %%~J-%%I
        )
        if defined FLAG goto :STOP
    )
    :STOP
    

    输出是:

    Aa-0
    Aa-1
    Aa-2
    Aa-3
    Aa-4
    Aa-5
    Bb-0
    Bb-1
    Bb-2
    Bb-3
    Break!
    Bb-4
    Break!
    Bb-5
    

    您会注意到内部循环在外部循环被破坏之前完成执行。

  3. 当某个条件为净时,下面的脚本会中断内部循环。为了不破坏外循环,需要一个包含内循环并从外循环调用 ( ) 的子例程,以对分解方法call隐藏外循环的代码块上下文:goto

    @echo off
    for %%J in (Aa Bb Cc) do (
        call :SUB "%%~J"
    )
    goto :EOF
    
    :SUB
    for /L %%I in (0,1,5) do (
        if "%~1"=="Bb" if %%I GTR 3 (
            echo Break!
            goto :STOP
        )
        echo %~1-%%I
    )
    :STOP
    

    输出是:

    Aa-0
    Aa-1
    Aa-2
    Aa-3
    Aa-4
    Aa-5
    Bb-0
    Bb-1
    Bb-2
    Bb-3
    Break!
    Cc-0
    Cc-1
    Cc-2
    Cc-3
    Cc-4
    Cc-5
    

    在这里,外部循环完成了它的执行,而不受损坏的内部循环的影响。


我希望(最后两个)示例之一适合您的脚本要求。

于 2016-05-05T02:53:37.233 回答