0

我正在编写一个批处理文件(我在 SU 上提出了一个问题)来遍历终端服务器以搜索特定用户。所以,我得到了我想做的事情的基本开始。

  1. 输入用户名
  2. 迭代终端服务器
  3. 显示找到用户的服务器(根据连接丢失的方式,他们可以不时在多个服务器上找到)
  4. 显示选项菜单

迭代我拥有的终端服务器:

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循环会重新开始吗?

我正在使用我可以使用的工具来做这件事,所以尽管我很想听听 PowerShell 和其他方法来做这件事,但这将是徒劳的。我有记事本,就是这样。

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

4

1 回答 1

4

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

而且我仍然不太了解您使用该脚本的确切位置。

首先,set命令的语法是

set <variable name>=<value>

如果你只是

set <variable name>

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

如果你想定义一个变量而不真正关心它的值,你仍然需要提供一个值。我通常1用于此类标志,因为它更像是一个开/关开关,而不是一个保存值的实际变量:

set Foo=1

不过,在你的情况下,你可能想要别的东西。批处理文件本身没有数组,您可以通过创建许多变量并在某处保存计数来模仿它们。我以前写过一次(现在有点过时了,但仍然有效)。

在您的情况下,您希望遍历多个服务器并为每个服务器遍历多个用户。您可以使用嵌套循环来做到这一点:

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

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

> set foo = bar
> echo %foo%
%foo%
> echo %foo %
 bar
于 2010-04-27T22:11:26.897 回答