我正在写一个每晚运行的蝙蝠,根据目录名称的第一部分将多个目录移动到新目录中。 原始文件夹由批次#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
列出了新目录,但我找不到将它们变成我的蝙蝠可以使用的变量的方法。
答案 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 /?