代码之家  ›  专栏  ›  技术社区  ›  IAbstract

批处理文件中的流控制

  •  1
  • IAbstract  · 技术社区  · 16 年前

    参考 Iterating arrays in a batch file

    我有以下几点:

    for /f "tokens=1" %%Q in ('query termserver') do (
        if not ERRORLEVEL (
            echo Checking %%Q
            for /f "tokens=1" %%U in ('query user %UserID% /server:%%Q') do (echo %%Q)
        )
    )
    

    运行时 query termserver 在命令行中,前两行是:

    Known
    ------------------------- 
    

    …然后是终端服务器列表。但是,我不想将这些作为 query user 命令。另外,我不想包括大约4台服务器。当我提供 UserID 使用此代码,程序将立即退出。我知道这和 if

    我曾尝试将一个变量设置为要检查的服务器的名称,但迭代将在第一台服务器上结束:

    set TermServers=Server1.Server2.Server3.Server7.Server8.Server10
    
    for /f "tokens=2 delims=.=" %%Q in ('set TermServers') do (
        echo Checking %%Q
        for /f "tokens=1" %%U in ('query user %UserID% /server:%%Q') do (echo %%Q)
    )
    

    我更喜欢第二个例子,而不是第一个,如果没有其他的清洁。

    2 回复  |  直到 6 年前
        1
  •  3
  •   Joey Gumbo    16 年前

    if errorlevel

    帮助 if 说:

    IF [NOT] ERRORLEVEL number command
    

    作为 如果错误级别 条件。那就是,你 必须 if errorlevel n 计算结果为 如果退出代码是 至少

    所以呢

    if errorlevel 1 ...
    

    捕获任何错误(通过退出代码发出信号),而

    if errorlevel 0 ...
    

    不管怎样,你可能想要一个

    if not errorlevel 1 ...
    

    跳过行

    for /f 命令有参数 skip=n 可用于在开始时跳过行。如果您的输出以两行不需要的行开始,那么您可以这样做

    for /f "skip=2 tokens=1" %%Q in ('query termserver') do
    

    迭代中的多个已知值 用于/f

    第二个代码片段的问题是 for 迭代 . 因此,当您给它一个环境变量时,它将对它进行标记化(并将标记放入不同的变量中),但循环只运行 每行一次 set 这里有一点容易出错,因为你可能会得到比你想要的更多。像这样的

    for /f ... in ("%TermServers%") ...
    

    那就容易多了。不过,这并不能解决最初的问题。解决这一问题的最简单方法可能如下:

    rem space-separated list of servers
    set TermServers=Server1 Server2 Server3 Server7 Server8 Server10
    
    rem call the subroutine with the list of servers
    call :query_servers %TermServers%
    
    rem exit the batch file here, to prevent the subroutine from running again afterwards
    goto :eof
    
    rem Subroutine to iterate over the list of servers
    :query_servers
    
      rem Process the next server in the list
      rem Note the usage of %1 here instead of a for loop variable
      echo Checking %1          
      for /f "tokens=1" %%U in ('query user %UserID% /server:%1') do (echo %%Q)
    
      rem Remove the first argument we just processed
      shift
    
      rem if there is still another server to be processed, then do so
      rem we're mis-using the subroutine label as a jump target here too
      if not [%1]==[] goto query_servers
    
    rem This is kind of a "return" statement for subroutines
    goto :eof
    

    预计到达时间: 我又一次错过了最明显的答案:

    set TermServers=Server1 Server2 Server3 Server7 Server8 Server10
    for %%S in (%TermServers%) do (
        for /f "tokens=1" %%U in ('query user %UserID% /server:%1') do (echo %%Q)
    )
    

    对于 ,

        2
  •  -2
  •   ewall    16 年前

    NT shell/batch语言不够智能,无法接受 IF NOT ERRORLEVEL (... --你需要做一个明确的比较,比如:

    if not %ERRORLEVEL%==0 (
    ...
    
    推荐文章