将CD刻录到多个未知目录中,一次创建子目录

时间:2018-02-24 16:47:23

标签: arrays batch-file

我正在写一个每晚运行的蝙蝠,根据目录名称的第一部分将多个目录移动到新目录中。 原始文件夹由批次#date and time和iteration#of lot。

创建
for /f "tokens=1,2,3,4 delims=_" %%d in ('dir /b /ad *') do mkdir G:\folder1\folder2\working\%%d

来自A1I00K161_170328_091931_001我创建了A1I00K161 然后我需要找到一种方法来进入这些新文件夹并创建另外5个文件夹 我的蝙蝠现在需要进入每个新目录,而我不必手动告诉它新的目录名称。假设dir /b列出了新目录,但我找不到将它们变成我的蝙蝠可以使用的变量的方法。

1 个答案:

答案 0 :(得分:0)

FOR 循环中可以使用命令

pushd "G:\folder1\folder2\working\%%d"

将当前目录路径推送到堆栈并转换为刚刚创建的目录 然后在这个目录中做一些事情,比如创建五个子目录。

最后一个命令

popd
必须在 FOR 循环中使用

从堆栈中弹出上一个当前目录,并使该目录再次成为当前目录。

for /f "tokens=1,2,3,4 delims=_" %%d in ('dir /b /ad *') do (
    mkdir "G:\folder1\folder2\working\%%d"
    pushd "G:\folder1\folder2\working\%%d"
    rem Other commands like five times MKDIR or MD with just directory name.
    popd
)

但根本不需要更改当前目录。使用固定目录路径的最佳批处理文件独立于启动批处理文件时的当前目录。

例如,如果源目录为C:\Temp\Test

,则可以使用此批处理代码
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "BaseTarget=G:\folder1\folder2\working"
for /D %%D in ("C:\Temp\Test\*") do (
    for /F "delims=_" %%I in ("%%~nxD") do (
        mkdir "%BaseTarget%\%%I\First Subfolder"
        mkdir "%BaseTarget%\%%I\Second Subfolder"
        mkdir "%BaseTarget%\%%I\Third Subfolder"
        mkdir "%BaseTarget%\%%I\Fourth Subfolder"
        mkdir "%BaseTarget%\%%I\Fifth Subfolder"
    )
)
endlocal

带有选项/D的命令 FOR 在指定目录中搜​​索与模式*匹配的非隐藏子目录,并为每个找到的子目录指定带有循环变量的完整路径的名称D

内部 FOR 使用指定的分隔符作为下划线,将没有路径的文件夹的名称拆分为子字符串(标记),并且默认情况下仅将第一个字符串分配给指定的循环变量{{1}这就完成了这项任务。

命令 MKDIR 创建一个完整的目录树,默认启用命令扩展,此处另外明确启用。

但是,如果源目录与I之类的基本目标目录相同,则需要不同的批处理文件代码:

G:\folder1\folder2\working

执行此批处理文件 FOR 执行命令行

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "BaseFolder=G:\folder1\folder2\working"
for /F "delims=_" %%I in ('dir "%BaseFolder%\*" /AD /B /ON 2^>nul') do (
    mkdir "%BaseFolder%\%%I\First Subfolder"
    mkdir "%BaseFolder%\%%I\Second Subfolder"
    mkdir "%BaseFolder%\%%I\Third Subfolder"
    mkdir "%BaseFolder%\%%I\Fourth Subfolder"
    mkdir "%BaseFolder%\%%I\Fifth Subfolder"
)
endlocal

在一个单独的命令进程中,在后台启动dir "G:\folder1\folder2\working\*" /AD /B /ON 2>nul 并捕获所有输出以处理此命令进程的 STDOUT 以供稍后处理。 DIR 只输出指定目录中所有子目录的名称,包括没有路径的隐藏子目录。

另请阅读有关Using Command Redirection Operators的Microsoft文章,了解cmd.exe /C的说明。重定向运算符2>nul必须使用 FOR 命令行上的插入符>进行转义,以便在执行命令之前Windows命令解释程序处理此命令行时将其解释为文字字符FOR ,它在后台启动的单独命令进程中执行嵌入式^命令行。

dir批处理代码的重要区别在于 FOR 处理的目录名称的捕获列表。因此,即使在创建其他目录,重命名或删除现有目录时, FOR 处理的目录列表也不会在命令块中运行命令时更改。在执行期间目录条目更改的目录上使用for /D通常会导致多次处理某些目录或跳过目录。

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • for /D
  • dir /?
  • echo /?
  • endlocal /?
  • for /?mkdir /?
  • md /?
  • popd /?
  • pushd /?
  • rem /?
  • set /?