迭代批处理文件中的数组

时间:2010-04-27 22:06:47

标签: arrays loops batch-file terminal-services

我正在编写一个批处理文件(I asked a question on SU)来迭代搜索特定用户的终端服务器。所以,我得到了我想要做的基本开始。

  1. 输入用户名
  2. 迭代终端服务器
  3. 显示找到用户的服务器(他们可以现在可以在多个服务器上找到,这取决于连接的丢失方式)
  4. 显示选项菜单
  5. 迭代终端服务器:

    for /f "tokens=1" %%Q in ('query termserver') do (set __TermServers.%%Q)
    

    现在,我收到了错误......

    Environment variable __TermServers.SERVER1 not defined
    

    ...为每个终端服务器。这是我的批处理文件中唯一的东西。有没有想过为什么会出现这种错误?显然,变量没有定义,但我理解SET命令才能做到这一点。

    我也在想,为了继续处理迭代(每个终端服务器),我需要做类似的事情:

    :Search    
    for /f "tokens=1" %%Q in ('query termserver') do (call Process) 
    goto Break
    
    :Process
    for /f "tokens=1" %%U in ('query user %%username%% /server:%%Q') do (set __UserConnection = %%C)
    goto Search
    

    但是,有两件事让我感到不安:

    1. 调用Process时,%% Q值是否仍然存在?
    2. 当我转到搜索时,for循环会重新开始吗?
    3. 我正在使用我拥有的工具来完成这项工作,因此,尽管我想了解PowerShell以及其他方法,但这将是徒劳的。我有记事本就是这样。

      注意:我会继续在SuperUser上提出这一系列问题,除了它似乎更多地涉及编程细节。

1 个答案:

答案 0 :(得分:3)

好的,这些是很多问题/问题等。在一个: - )

而且我仍然没有完全了解你的目标。

首先,set命令的语法是

set <variable name>=<value>

如果你这样做

set <variable name>

然后它将列出以<variable name>开头的所有环境变量。如果没有,那么它将输出您正在看到的错误消息。

如果要在不实际关注其值的情况下定义变量,则仍需要提供值。我通常使用1来表示这样的标志,因为它更像是一个开/关开关而不是一个保持值的实际变量:

set Foo=1

在你的情况下,你可能想要别的东西。批处理文件中本身没有数组,您可以通过创建一些变量并在某处保持计数来模仿它们。我已经写过once before(现在有点过时,但仍然有效)。

在您的情况下,您希望迭代多个服务器以及针对多个用户的每个服务器。你可以用嵌套循环来做到这一点:

for /f "tokens=1" %%Q in ('query termserver') do (
   for /f "tokens=1" %%U in ('query user ... /server:%%Q' do (
      ...
   )
)

至于你的两个问题:

  1. 不,循环变量仅在循环中 循环,而不是在调用子程序时。但是,您可以将其传递给子例程:

    for ... in (...) do call Process %%Q
    

    然后,您可以在子例程中使用%1访问它。老实说,在大多数情况下,我认为嵌套循环更容易阅读。

  2. 另一个错误(咬你一个):如前所述,set语法是

    set variable=value
    

    请注意,=符号周围有 no 空格。如果有,那么在变量名的末尾或值的开头有一个空格:

    > set foo = bar
    > echo %foo%
    %foo%
    > echo %foo %
     bar