【问题标题】:How can I edit a variable and also run multiple commands in a FOR loop?如何编辑变量并在 FOR 循环中运行多个命令?
【发布时间】:2019-08-13 16:38:10
【问题描述】:

我想运行一个 FOR LOOP 来使用它返回的变量创建文件,然后修改结果变量和输出。

我正在尝试根据父文件夹名称创建文件,其中包含输出文件中的子文件夹,然后将字符串附加到输出文件中每一行的开头。

REM THIS SECTION IS JUST TO RECREATE MY ISSUE.  THESE FILES AND FOLDERS ALREADY EXIST.  
REM THEY ARE NOT SEQUENTIAL AND HAVE RANDOM NAMES.
REM ==================================================================

md %temp%\looptest\folder1\subfolder1
md %temp%\looptest\folder2
md %temp%\looptest\folder3

echo echo folder2-file1-line1 >> %temp%\looptest\folder2\folder2-file1.bat
echo echo folder2-file1-line2 >> %temp%\looptest\folder2\folder2-file1.bat
echo echo folder2-file1-line3 >> %temp%\looptest\folder2\folder2-file1.bat
echo echo folder2-file2-line1 >> %temp%\looptest\folder2\folder2-file2.bat
echo echo folder2-file2-line2 >> %temp%\looptest\folder2\folder2-file2.bat
echo echo folder2-file2-line3 >> %temp%\looptest\folder2\folder2-file2.bat
echo echo folder2-file3-line1 >> %temp%\looptest\folder2\folder2-file3.bat
echo echo folder2-file3-line2 >> %temp%\looptest\folder2\folder2-file3.bat
echo echo folder2-file3-line3 >> %temp%\looptest\folder2\folder2-file3.bat

echo echo folder3-file1-line1 >> %temp%\looptest\folder3\folder3-file1.bat
echo echo folder3-file1-line2 >> %temp%\looptest\folder3\folder3-file1.bat
echo echo folder3-file1-line3 >> %temp%\looptest\folder3\folder3-file1.bat
echo echo folder3-file2-line1 >> %temp%\looptest\folder3\folder3-file2.bat
echo echo folder3-file2-line2 >> %temp%\looptest\folder3\folder3-file2.bat
echo echo folder3-file2-line3 >> %temp%\looptest\folder3\folder3-file2.bat
echo echo folder3-file3-line1 >> %temp%\looptest\folder3\folder3-file3.bat
echo echo folder3-file3-line2 >> %temp%\looptest\folder3\folder3-file3.bat
echo echo folder3-file3-line3 >> %temp%\looptest\folder3\folder3-file3.bat

echo echo subfolder1-file1-line1 >> %temp%\looptest\folder1\subfolder1\subfolder1-file1-extratext.bat
echo echo subfolder1-file1-line2 >> %temp%\looptest\folder1\subfolder1\subfolder1-file1-extratext.bat
echo echo subfolder1-file1-line3 >> %temp%\looptest\folder1\subfolder1\subfolder1-file1-extratext.bat
echo echo subfolder1-file2-line1 >> %temp%\looptest\folder1\subfolder1\subfolder1-file2-extratext.bat
echo echo subfolder1-file2-line2 >> %temp%\looptest\folder1\subfolder1\subfolder1-file2-extratext.bat
echo echo subfolder1-file2-line3 >> %temp%\looptest\folder1\subfolder1\subfolder1-file2-extratext.bat
echo echo subfolder1-file3-line1 >> %temp%\looptest\folder1\subfolder1\subfolder1-file3-extratext.bat
echo echo subfolder1-file3-line2 >> %temp%\looptest\folder1\subfolder1\subfolder1-file3-extratext.bat
echo echo subfolder1-file3-line3 >> %temp%\looptest\folder1\subfolder1\subfolder1-file3-extratext.bat


REM THIS IS WHERE MY ACTUAL QUESTION STARTS
REM ========================================================

setlocal enabledelayedexpansion

FOR /F "delims=" %%G IN ('dir /a:d /b /s %temp%\looptest\') DO (

    set "var=%%G"
    set "var=!var:%temp%\looptest\=!

    (
        dir /b %temp%\looptest\!var!

    )>>"%temp%\looptest\!var!-output.bat"


)

folder1-output.bat 无法使用,因为它的子文件夹中没有文件,只有另一个文件夹,没关系,如果需要我可以忽略它。

现在,文件folder2-output.bat 包含以下行:

folder2-file1.bat
folder2-file2.bat
folder2-file3.bat

我希望folder2-output.bat 包含以下行:

call folder2-file1.bat
call folder2-file2.bat
call folder2-file3.bat

我希望folder3-output.bat 包含以下行:

call folder3-file1.bat
call folder3-file2.bat
call folder3-file3.bat

我希望folder1\subfolder1-output.bat 包含以下行:

call subfolder1-file1-extratext.bat
call subfolder1-file2-extratext.bat
call subfolder1-file3-extratext.bat

但我不知道在哪里回显 CALL 命令以添加到 FOR LOOP。

我想我需要做一些类似的事情

    set "var2=%%G"
    set "var2=CALL !var2!

然后

ECHO !var2! !var! >>"%temp%\looptest\!var!-output.bat"

但我不确定将其放在 FOR 循环中的哪个位置。

【问题讨论】:

    标签: batch-file for-loop variables


    【解决方案1】:
    @ECHO OFF
    SETLOCAL
    SET "sourcedir=%temp%\looptest"
    FOR /d /r "%sourcedir%" %%G IN (*) DO (
     ECHO examining directory "%%G"
     rem if the directory contains any .bat files then create a file
     rem called leafname-output.bat in the parent containing
     rem "call each-batfilename-found"
     IF EXIST "%%G\*.bat" (
      ECHO "%%G" contains batchfiles
      ECHO "%%~dpG" is parent
      ECHO "%%~nxG" is leafname
      FOR /f "delims=" %%a IN ('DIR /b /a-d "%%G\*.bat"') DO >>"%%G-output.bat" ECHO CALL "%%~nxa"
     ) ELSE (
      ECHO "%%G" does NOT contain batchfiles
     )
     ECHO -------------------------------------
    )
    
    dir/s "%sourcedir%\*-output.bat"
    
    GOTO :EOF
    

    有趣的小冒险。非常好,您提供了创建测试文件的代码 - 但您似乎明智地将您的 temp 目录更改为不包含空格的位置,所以我不确定它是否适用于 vanilla 安装。

    您显然研究过delayedexpansion,但您似乎更关心解决问题的方法,而不是针对解决方案

    我相信echoes 和上面的评论充分记录了我在分析您的方法以确定要解决的问题后选择的方法。毫无疑问,您现在将对for 的各种用途放在放大镜上,如for /? 中所述,并且这里有许多关于SO 的示例。当然,我可能错过了目标。

    当然,如果您在开始之前不删除*-output.bat 文件,您可能会遇到问题,因为这些文件已附加到,而寻找*.bat 文件的dir 将在提供的列表中包含...-output.bat .使用列出的最终dir/s 命令的突变应该很容易解决。

    【讨论】:

    • For /D /R 看起来很相似 ;-) +1
    【解决方案2】:

    对于我的 Ramdisk A 上的本地测试:我更改并简化了您的批次:

    :: Q:\Test\2019\08\13\SO_57482013.cmd
    @Echo off
    Set "Base=A:\Test"
    :: create folders
    for %%D in (folder1\subfolder1 folder2 folder3) Do md "%Base%\looptest\%%D"
    :: create files
    for %%D in (folder2 folder3
    ) Do for /l %%F in (1,1,3
    ) Do for /l %%L in (1,1,3
    ) Do echo echo %%D-file%%F-line%%L >>"%Base%\looptest\%%D\%%D-file%%F.bat"
    for /l %%F in (1,1,3
    ) Do for /l %%L in (1,1,3
    ) Do echo echo subfolder1-file%%F-line%%L >> "%Base%\looptest\folder1\subfolder1\subfolder1-file%%F-extratext.bat"
    

    这将创建以下文件夹/文件结构(所有文件都包含第 1..3 行):

    > tree a:\ /F
    A:\
    └───Test
        └───looptest
            ├───folder1
            │   └───subfolder1
            │           subfolder1-file1-extratext.bat
            │           subfolder1-file2-extratext.bat
            │           subfolder1-file3-extratext.bat
            │
            ├───folder2
            │       folder2-file1.bat
            │       folder2-file2.bat
            │       folder2-file3.bat
            │
            └───folder3
                    folder3-file1.bat
                    folder3-file2.bat
                    folder3-file3.bat
    

    IMO 您在文件夹中调用批处理时缺少包含文件夹名称, 这个改变的例程会做:

    REM THIS IS WHERE MY ACTUAL QUESTION STARTS
    REM ========================================================
    
    FOR /D /R "%Base%\looptest" %%G IN (*) Do (
      For %%F in (%%G\*.bat) Do Echo @Call %%~nxG\%%~nxF
    ) >"%%~dpG%%~nxG-output.bat"
    
    

    例如A:\Test\looptest\folder2-output.bat 包含:

    @Call folder2\folder2-file1.bat
    @Call folder2\folder2-file2.bat
    @Call folder2\folder2-file3.bat
    

    当从文件夹A:\Test\looptest 中执行时,会产生:

    folder2-file1-line1
    folder2-file1-line2
    folder2-file1-line3
    folder2-file2-line1
    folder2-file2-line2
    folder2-file2-line3
    folder2-file3-line1
    folder2-file3-line2
    folder2-file3-line3
    

    【讨论】:

      猜你喜欢
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-12
      • 2021-12-25
      • 1970-01-01
      相关资源
      最近更新 更多