在所有子目录中运行 .bat 而不会陷入循环

在所有子目录中运行 .bat 而不会陷入循环

我有一个名为“Finals”的主文件夹,其中包含 40 个子文件夹(所有文件夹的名称中都有空格),我想在每个子文件夹中执行以下操作

mkdir Blank_Mockup\Option_1 Blank_Mockup\Option_2 Blank_Mockup\Option_3 Blank_Mockup\Option_4 Blank_Mockup\Option_5 Blank_Mockup\Option_6 Designed_Mockup\Option_1 Designed_Mockup\Option_2 Designed_Mockup\Option_3 Designed_Mockup\Option_4 Designed_Mockup\Option_5 Designed_Mockup\Option_6 Flat_File\Option_1 Flat_File\Option_2 Flat_File\Option_3 Flat_File\Option_4 Flat_File\Option_5 Flat_File\Option_6 Working_File\Option_1 Working_File\Option_2 Working_File\Option_3 Working_File\Option_4 Working_File\Option_5 Working_File\Option_6

以上创建了以下文件夹结构:

|
├───Blank_Mockups
│   ├───Option 1
│   ├───Option 2
│   ├───Option 3
│   ├───Option 4
│   ├───Option 5
│   └───Option 6
|
├───Designed_Mockups
│   ├───Option 1
│   ├───Option 2
│   ├───Option 3
│   ├───Option 4
│   ├───Option 5
│   └───Option 6

我想做的是,在 40 个子文件夹中分别运行上述命令。我尝试使用此处其他帖子中的一些答案进行以下操作,但它陷入了循环,命令一直在新创建的文件夹中执行。

pushd "D:\Users\blend\OneDrive\Freelance\SwagMagic\Final"
for /f "Delims=" %%i in ('dir /ad /b') do (
    cd "%%i"
    mkdir Blank_Mockup\Option_1 Blank_Mockup\Option_2 Blank_Mockup\Option_3 Blank_Mockup\Option_4 Blank_Mockup\Option_5 Blank_Mockup\Option_6 Designed_Mockup\Option_1 Designed_Mockup\Option_2 Designed_Mockup\Option_3 Designed_Mockup\Option_4 Designed_Mockup\Option_5 Designed_Mockup\Option_6 Flat_File\Option_1 Flat_File\Option_2 Flat_File\Option_3 Flat_File\Option_4 Flat_File\Option_5 Flat_File\Option_6 Working_File\Option_1 Working_File\Option_2 Working_File\Option_3 Working_File\Option_4 Working_File\Option_5 Working_File\Option_6
)
popd

答案1

一个简单的解决方案是使用以下命令返回(“向上”)到循环中的父目录cd ..

pushd "D:\Users\blend\OneDrive\Freelance\SwagMagic\Final"
for /f "Delims=" %%i in ('dir /ad /b') do (
    cd "%%i"
    mkdir Blank_Mockup\Option_1 Blank_Mockup\Option_2 Blank_Mockup\Option_3 Blank_Mockup\Option_4 Blank_Mockup\Option_5 Blank_Mockup\Option_6 Designed_Mockup\Option_1 Designed_Mockup\Option_2 Designed_Mockup\Option_3 Designed_Mockup\Option_4 Designed_Mockup\Option_5 Designed_Mockup\Option_6 Flat_File\Option_1 Flat_File\Option_2 Flat_File\Option_3 Flat_File\Option_4 Flat_File\Option_5 Flat_File\Option_6 Working_File\Option_1 Working_File\Option_2 Working_File\Option_3 Working_File\Option_4 Working_File\Option_5 Working_File\Option_6   
    cd ..
)
popd

解释

[欢迎提出技术修正/批评。]

  • dir /ad /b返回当前目录(例如)的一组裸文件夹名称Folder 1Folder 2例如,。因此,在每次循环迭代中将对应于例如,,,。Folder 3Final%%iFolder 1Folder 2Folder 3Folder ...

  • cd %%i当您在循环中调用时,这与调用以下代码相同:

    cd Folder 1 
    

    或当前的值%%i。也就是说,你是改变目录只需指定文件夹名称即可cd。假定此文件夹位于您正在处理的当前目录中。

  • 开始于:

     D:\Users\blend\OneDrive\Freelance\SwagMagic\Final
    

    在第一个循环中,调用cd Folder 1与调用相同,例如:

     cd D:\Users\blend\OneDrive\Freelance\SwagMagic\Final\Folder 1
    
  • 但是,在第二个循环中,当前目录仍然是:

    D:\Users\blend\OneDrive\Freelance\SwagMagic\Final\Folder 1 
    

    使用 cd 更改目录在第一个循环中使用cd %%i/ 。因此,在(第二个)循环中调用与调用或调用相同,例如:cd Folder 1cd %%icd Folder 2

     cd D:\Users\blend\OneDrive\Freelance\SwagMagic\Final\Folder 1\Folder 2
    

    但可能没有

     D:\Users\blend\OneDrive\Freelance\SwagMagic\Final\Folder 1\Folder 2 
    

    所以你很可能会收到错误。

  • 为了解决这个问题,您可以将目录改回例如:

    D:\Users\blend\OneDrive\Freelance\SwagMagic\Final
    

    在执行下一个循环之前,然后cd %%i。在每个循环结束时,您可以cd使用转到父目录..。因此,如果批处理文件当前正在运行:

     D:\Users\blend\OneDrive\Freelance\SwagMagic\Final\Folder 1
    

    第一次循环之后,调用cd ..与调用相同:

     cd D:\Users\blend\OneDrive\Freelance\SwagMagic\Final
    

    这意味着下一次调用cd %%i(例如cd Folder 2)应该可以正常工作,并且相当于例如:

     cd D:\Users\blend\OneDrive\Freelance\SwagMagic\Final\Folder 2
    

相关内容