如何在批处理文件中处理多个'for'语句?

时间:2014-12-17 23:52:43

标签: batch-file dsquery

我正在尝试创建一个批处理文件,该文件将从文本文件中获取用户列表,针对Active Directory运行dsquery以确定该帐户是否已被禁用,然后将结果输出到其他文本文件包含用户ID和是否已被禁用的状态(是/否)。

我觉得我错误地定位了引号或括号,但我也不能100%确定多个'for'语句是否可以像这样嵌套。非常感谢。

for /f "tokens=1" %%G in (termlist.txt) do (
for /f "Tokens=*" %%a in ('dsquery user -samid %%G^|dsget user -disabled^| Find /v "disabled"^| Find /v "dsget succeeded"') do set disable=%%a)
echo "%%G %disable%" >> termvalid.txt)

3 个答案:

答案 0 :(得分:0)

嵌套for循环完全有效。 但是,您需要确保所有令牌变量都不会重叠。

for /f "tokens=1,2" %%A in ("hello world") do echo %%A

使用%% A和%% B(因为tokens=1,2),即使只声明并显式使用%% A,因此要使用的下一个安全变量是%% C.也就是说,对于变量是区分大小写的,所以你可以使用%% A到%% Z和%% a到%% z,这意味着你在代码中使用它的方式可以正常工作(并且如果它也可以正常工作你使用%% A,只要内部for循环没有创建超过6个令牌)。

答案 1 :(得分:0)

  1. 您遗漏了^字符的每个实例前面的空格。
  2. 您的整个FOR构造作为一行加载(无论它占用多少物理行)...因此%disable%在整个构造加载时展开,并且在运行时不会更改。您可以启用延迟扩展,但在这种情况下不需要。
  3. 试试这个(如果你想确定你没有附加到旧的不需要的文件,请使用第一行):

    if exist termvalid.txt del /f /q termvalid.txt
    for /f "tokens=1" %%G in (termlist.txt) do (
       for /f "Tokens=*" %%a in ('dsquery user -samid %%G ^|dsget user -disabled ^| Find /v "disabled" ^| Find /v "dsget succeeded"') do echo "%%G %%a" >> termvalid.txt))
    

答案 2 :(得分:0)

有一种简单的方法可以检查多个嵌套命令是否具有正确数量的括号。只需将每个嵌套命令缩进到右边三个空格,将左括号放在同一行,然后将右括号放在命令的同一列中关闭。例如

for %%a in (set) do (
   for %%b in (set) do (
      if %%a equ %%b (
         then part
      ) else (
         else part
      )
   )
)

当我将这种格式应用于您的代码时,我得到了这个:

for /f "tokens=1" %%G in (termlist.txt) do (
   for /f "Tokens=*" %%a in ('dsquery user -samid %%G^|dsget user -disabled^| Find /v "disabled"^| Find /v "dsget succeeded"') do set disable=%%a
)
echo "%%G %disable%" >> termvalid.txt)

这样,现在很明显有一个额外的右括号(被忽略),但是%% G被放置在外面它的FOR。有两种方法可以解决这个问题;消除正确的治疗并将ECHO移到正确的位置:

for /f "tokens=1" %%G in (termlist.txt) do (
   for /f "Tokens=*" %%a in ('dsquery user -samid %%G^|dsget user -disabled^| Find /v "disabled"^| Find /v "dsget succeeded"') do set disable=%%a
   echo "%%G !disable!" >> termvalid.txt
)

...或插入错过的左括号:

for /f "tokens=1" %%G in (termlist.txt) do (
   for /f "Tokens=*" %%a in ('dsquery user -samid %%G^|dsget user -disabled^| Find /v "disabled"^| Find /v "dsget succeeded"') do (
      set disable=%%a
   )
   echo "%%G !disable!" >> termvalid.txt
)

...除了%disable%必须通过delayed!变量访问的问题!扩展,因为它在FOR命令中。