基目录有大约20个子目录。每个子目录都有许多文件。我需要立即将所有文件从特定子目录移动到基目录中新创建的子目录。
例如,我在基本目录D:\Documents
中有以下目录:
D:\Documents\12345\data\images\
D:\Documents\12345\test\
D:\Documents\12345\documents\
我需要将images
下的所有文件移动到新的基本目录中创建目录D:\Documents\images
。
你能帮帮我吗?
这个小批量文件使这项工作:
@echo off
md D:\Documents\images 2>nul
for /F "delims=" %%I in ('dir D:\Documents\* /A-D /B /S 2^>nul ^| %SystemRoot%\System32\findstr.exe /B /I /R /C:D:\\Documents\\..*\\images\\ 2^>nul') do (
move /Y "%%I" "D:\Documents\images\%%~nxI"
rd "%%~dpI" 2>nul
)
批处理文件首先创建目标目录,如果此目录已存在,则禁止MD输出错误消息。此批处理文件期望可以创建此目录并将文件移动到此目录中,而无需任何其他检查。
由于D:\Documents
(属性不是目录),命令DIR在/S
及其所有子目录中搜索/A-D
因为/B
(属性不是目录)并以裸格式输出它们因为/S
这意味着只有带文件扩展名的文件名,在这种情况下也是完整路径因为D:\Documents
。
DIR可能无法在整个2>nul
目录树中找到任何文件。在这种情况下输出的用于处理STDERR的错误消息通过在命令DIR之后使用D:\Documents\
将其重定向到设备NUL来抑制。
DIR的此输出被重定向为用作过滤器的命令FINDSTR的输入。它运行一个正则表达式查找搜索以\images\
开头的行,在D:\Documents\images\
必须找到之前至少还有一个字符。所以它忽略了目录D:\Documents\12345\data\images\Subfolder\
中的文件,如果这个目录已经存在,启动批处理文件的文件。但是它没有过滤掉例如\images\
中的文件,因为这个正则表达式不会检查路径末尾是否找到2>nul
。
FINDSTR可能找不到与正则表达式匹配的任何行(文件名)。在这种情况下输出的错误消息通过在命令FINDSTR之后使用cmd.exe /C
来抑制。
带有DIR和FINDSTR的命令行由FOR在一个单独的命令进程中执行,该进程在后台没有可见窗口时使用>
启动。因此,重定向运算符|
和^
必须使用delims=
进行转义,在执行FOR之前,Windows命令解释器在解析整个FOR命令行时首先将其解释为文字字符。
命令行输出的行与DIR和FINDSTR在单独的命令过程中处理STDOUT由FOR捕获,然后逐行处理。使用D:\Documents\images\
时,通过指定空分隔符列表,可以禁用使用空格和水平制表符作为分隔符将每一行拆分为标记的默认行为。
命令MOVE将找到的文件移动到2>nul
,并覆盖该目录中具有相同名称的文件。
如果此目录在移动文件后为空,则命令RD将删除刚移动的文件的目录。否则在目录尚未为空时,命令RD输出错误消息以处理再次使用dir /?
抑制的STDERR。
要了解使用的命令及其工作方式,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。
echo /?
findstr /?
for /?
md /?
move /?
rd /?
另请阅读有关qazxswpoi的Microsoft文章。