【问题标题】:Batch for loop issue批处理循环问题
【发布时间】:2014-06-16 14:42:31
【问题描述】:

这个批处理脚本应该检测可移动驱动器,并为每个驱动器循环执行以下过程:格式化、写入文件。问题是它只对一个驱动器执行此操作。例如,我可以放入两个驱动器,它会同时检测到它们并处理它们中的循环两次。该问题与正在更新的驱动器名称的变量有关,但我对批处理脚本并不是那么精通。如果这个网站上已经有另一个答案,我不知道它是什么样子,因为我不知道关于命令的所有内容(我已经查看了所有给出的建议)。如果这是一个重复的问题,我很抱歉。只要给我指明正确的方向,我就会在路上!

    @echo off
    setlocal enabledelayedexpansion
    for /F "tokens=1*" %%a in ('fsutil fsinfo drives') do (
       for %%c in (%%b) do (
          echo Starting loop with %yyy%
          for /F "tokens=3" %%d in ('fsutil fsinfo drivetype %%c') do (
             if %%d equ Removable (
                echo Drive written to is %yyy%
                format /y %yyy:~0,2% /fs:FAT32 /v:LCM2014 /q
             )
             set yyy=%%c
             echo Ending loop with %yyy%
          )
       )
    )

【问题讨论】:

  • 我从批处理脚本中删除了文件写入只是因为如果格式有效,文件写入将有效。

标签: batch-file for-loop batch-processing usb-drive


【解决方案1】:

在块语句(a parenthesised series of statements) 中,整个块被解析并然后执行。块中的任何%var% 都将替换为该变量的值在分析块时 - 在块执行之前 - 同样适用于FOR ... DO (block)

因此,IF (something) else (somethingelse) 将在遇到IF 时使用%variables% 的值执行。

解决此问题的两种常见方法是 1) 使用 setlocal enabledelayedexpansion 并使用 !var! 代替 %var% 来访问 var 的更改值或 2) 调用子例程以使用改变了值。

您发布的代码中的yyy 显然存在问题。尝试将%yyy% 替换为!yyy!,看看有什么不同。

【讨论】:

  • 它不会改变任何东西。我用 !yyy! 替换了所有的 %yyy%。还是同样的问题。有什么想法吗?
  • 您是否也将%yyy:~0,2% 更改为!yyy:~0,2!?关键是在解析命令时,任何%var% 都会被var 的内容替换。 !var! 在延迟扩展模式下访问 te 值,因为它更改 - 即运行时值。除此之外,您还需要显示回声显示的内容。
  • 以 F:\ 结束循环 以 F:\ 结束循环 以 F:\ 结束循环 以 F:\ 开始循环 写入的驱动器为 F:\ 文件的类型系统是FAT32。 QuickFormatting 7.6 GB 正在初始化文件分配表 (FAT)... 以 F:\ 结束循环 以 F:\ 开始循环 写入的驱动器为 F:\ 文件系统的类型为 FAT32。 QuickFormatting 7.6 GB 正在初始化文件分配表 (FAT)... 格式化完成。以 F:\ 结束循环
  • 这就是它吐出来的。如果我添加 !yyy!在中间并使用 setlocal enabledelayedexpansion echo !yyy! 对其进行初始化setlocal disabledelayedexpansion... 它包括之前的驱动器(在这种情况下是 cd 驱动器和一个 USB 驱动器,同时检测所有这些驱动器
  • 在您进行试验时,将echo 发送到format... 行可能是一个非常好的主意。 每次提及yyy 的值似乎是F:` means that yyy` 的事实并没有改变。 注意您正在更改yyy 之后 if .. removable 块 - 这应该是之前。这可能解释了drive before it 现象。 setlocal enable... .. setlocal disable... 确实反转 local 环境,它会创建环境的新副本。要终止本地环境,您需要执行endlocal 命令或到达物理文件结尾
猜你喜欢
  • 2015-05-03
  • 1970-01-01
  • 2019-08-06
  • 2017-06-15
  • 2019-01-26
  • 1970-01-01
  • 2011-02-05
  • 1970-01-01
相关资源
最近更新 更多