在批处理文件中遍历数组(Iterating arrays in a batch file)

2019-10-28 18:56发布

我写一个批处理文件( 我问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. 调用过程时是%% Q值还活着吗?
  2. 当我转到搜索,将在for循环是从头开始?

我与我在我手上的工具这样做,所以就像我想听到PowerShell和其他方法可以做到这一点,那将是徒劳的。 我有记事本,仅此而已。

注:我会继续这条线的上的超级用户的问题,但它似乎越来越进入编程细节。

Answer 1:

好吧,这些都是不少疑问/问题/等。 在一个:-)

我还是不太拿到哪儿你与该脚本领导。

首先,对于语法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


文章来源: Iterating arrays in a batch file