Хорошо, это довольно много вопросов / проблем / и т.д. в одном: -)
И я до сих пор не совсем понимаю, куда именно вы идете с этим сценарием.
Прежде всего, синтаксис команды 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 (
...
)
)
Что касается ваших двух вопросов там:
Нет, переменная цикла действительна только внутри цикла, но не при вызове подпрограммы. Вы можете передать его подпрограмме, однако:
for ... in (...) do call Process %%Q
Затем вы можете получить к нему доступ с помощью %1
в подпрограмме. Честно говоря, хотя, в большинстве случаев, я думаю, что вложенные циклы легче читать.
Да.
Еще одна ошибка (одна из которых укусит вас ): Как упоминалось ранее, синтаксис set
равен
set variable=value
Обратите внимание, что вокруг знака =
есть нет пробела. Если есть, то у вас есть пробел в конце имени переменной или в начале значения:
> set foo = bar
> echo %foo%
%foo%
> echo %foo %
bar