我正在编写一个批处理文件(I asked a question on SU)来迭代搜索特定用户的终端服务器。所以,我得到了我想要做的基本开始。
迭代终端服务器:
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
但是,有两件事让我感到不安:
我正在使用我拥有的工具来完成这项工作,因此,尽管我想了解PowerShell以及其他方法,但这将是徒劳的。我有记事本就是这样。
注意:我会继续在SuperUser上提出这一系列问题,除了它似乎更多地涉及编程细节。
答案 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 (
...
)
)
至于你的两个问题:
不,循环变量仅在循环中 循环,而不是在调用子程序时。但是,您可以将其传递给子例程:
for ... in (...) do call Process %%Q
然后,您可以在子例程中使用%1
访问它。老实说,在大多数情况下,我认为嵌套循环更容易阅读。
是
另一个错误(将咬你一个):如前所述,set
语法是
set variable=value
请注意,=
符号周围有 no 空格。如果有,那么在变量名的末尾或值的开头有一个空格:
> set foo = bar
> echo %foo%
%foo%
> echo %foo %
bar