Batch file 如何处理多个';对于';批处理文件中的语句?

Batch file 如何处理多个';对于';批处理文件中的语句?,batch-file,dsquery,Batch File,Dsquery,我正在尝试创建一个批处理文件,该文件将从文本文件中获取用户列表,对Active Directory运行dsquery以确定帐户是否已禁用,然后将结果输出到另一个文本文件,该文件包含用户ID以及用户是否已禁用的状态(是/否) 我觉得我把引号或括号放错了位置,但我也不能100%确定是否可以像这样嵌套多个“for”语句。非常感谢您的投入 for /f "tokens=1" %%G in (termlist.txt) do ( for /f "Tokens=*" %%a in ('dsquery use

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

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

for /f "tokens=1,2" %%A in ("hello world") do echo %%A
使用%%A和%%B(因为
代币=1,2
),即使只声明并显式使用%%A,所以下一个使用的安全变量是%%C。也就是说,变量区分大小写,因此您可以使用%%A到%%Z和%%A到%%Z,这意味着您在代码中使用它的方式会很好(如果您使用%%A,只要内部for循环创建的令牌不超过6个,它也可以正常工作)

  • 您在^character的每个实例前面都漏掉了空格
  • 整个FOR构造加载为一行(无论它占用多少物理行)…因此%disable%在加载整个构造时展开,在运行时不会更改。您可以启用延迟展开,但在这种情况下不需要
  • 尝试此操作(如果要确保未附加到旧的不需要的文件,请使用第一行):


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

    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之外。有两种方法可以解决此问题:消除右父项并将回音移动到正确的位置:

    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!variable!扩展来访问的问题之外,因为它在FOR命令中。

    代码似乎在执行顺序dsquerys,但它没有将请求的输出回显到我指定的文本文件中。我不相信我的变量重叠。检查到附加旧文件。此调整对我有效,谢谢!
    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
    )