【问题标题】:How to handle multiple 'for' statements in a batch file?如何处理批处理文件中的多个“for”语句?
【发布时间】:2014-12-17 23:52:42
【问题描述】:

我正在尝试创建一个批处理文件,该文件将从文本文件中获取用户列表,对 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)

【问题讨论】:

    标签: batch-file dsquery


    【解决方案1】:
    1. 您省略了每个 ^ 字符实例前面的空格。
    2. 您的整个 FOR 构造被加载为一行(无论它占用多少物理行)...因此 %disable% 在加载整个构造时展开,并且在运行时不会更改。您可以启用延迟扩展,但在这种情况下不需要这样做。

    试试这个(如果你想确保没有附加到旧的不需要的文件,请使用第一行):

    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】:

    嵌套的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 个)。

    【讨论】:

    • 代码似乎可以正常执行顺序 dsqueries,但它没有将请求的输出回显到我指定的文本文件中。我不相信我的变量是重叠的。
    【解决方案3】:

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

    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之外。有两种方法可以解决此问题;消除正确的 parenteses 并将 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% 必须通过延迟访问的问题!变量!扩展,因为它在 FOR 命令中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-30
      • 2014-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多