批量命令将文件从子目录移动到新目录

我正在尝试使用下面的batch file将文件从一个文件夹移动到另一个文件夹。 批处理命令将根据源文件夹中每个文件的创builddate在目标文件夹中创build子文件夹。

问题是源文件夹包含子文件夹和批处理命令不能recursion到子文件夹。

请告知如何修改batch file以允许recursion到源文件夹中的子文件夹。

谢谢

Rialet

echo %1 "-" %2 If [%1]==[] ECHO "Source Directory parameter required"&GOTO :EOF If [%2]==[] ECHO "Target Directory parameter required"&GOTO :EOF SET TrimQuote=%2 for /f "useback tokens=*" %%T in ('%2') do set TrimQuote=%%~T REM echo %TrimQuote% ::loop through files only For /F "TOKENS=1 DELIMS=%_TabSpace%" %%B In ('dir %1 /ad /B /OD') DO ( REM echo "%%B - " %%B For /F "TOKENS=1 DELIMS=%_TabSpace%" %%D In ('dir %1\"%%B" /ad /OD ^| findstr /B [0-9][0-9]/[0-9]') DO ( REM echo "%%D - " %%D for /F "tokens=1,2,3,4 delims=/ " %%b in ("%%D") do ( REM echo "b = " %2\%%c%%a\%%b REM echo %2\%%d%%c\%%b if NOT exist %2\%%d%%c\%%b md %2\%%d%%c\%%b move %1\"%%B" %2\%%d%%c\%%b\ ) ) ) 

尝试使用

 For /F "TOKENS=1 DELIMS=%_TabSpace%" %%B In ('dir %1 /ad /S /B /OD') DO ( 

/s会导致递归。 不利之处在于dir命令的输出是d:\path\file.ext – 这可能与您的"TOKENS=1 DELIMS=%_TabSpace%"不能很好地结合。 你可能需要使用"delims=" (即没有分隔符,因此token1中的整行)。

然后,您可以检索完整文件名的各个部分,如%%~dB %%~pB%%~nB%%~xB 〜nB和%%~xB 〜xB(驱动器,路径,naem和扩展名) – 如果您例如,希望使用%%~nxB作为名称+扩展名。


补充信息 – 批注。

 @ECHO OFF SETLOCAL :: The above two lines are a traditional batch introduction. :: The first turns `ECHO`ing of the command to the console OFF :: The second makes all changes to the environment 'local' :: which means that any variable changes made during the batch :: will be undone at the end, restoring the original environment. :: Note that the official remarks/comments method is REM This is a remark :: But the double-colon method is commonly used as :: is less intrusive :: Echo the two parameters given to the batch (%1 and %2) echo %1 "-" %2 :: The original parameter-present detection is weak. This is a better method SET target=%~1 If not defined target ECHO "Source Directory parameter required"&GOTO :EOF SET target=%~2 If not defined target ECHO "Target Directory parameter required"&GOTO :EOF :: Note `trimquote` (batch is largely case-insensitive) is a meaningless name :: New name TARGET is better. Setting to %~2 removes enclosing quotes from :: string assigned to variable. ::loop through files only :: `"delims="` means there are no delimiters, so the entire line is assigned to :: the variable `%%B` (FOR loop variablenames ("metavariables") ARE case-sensitive!) :: The line being assigned comes from the output of the `DIR` command :: which is filenames only (/ad) in subdirectories (/s) in basic form (/b) :: (ie name only, no dates, sizes, headers or summary) and in order of date (/od) For /F "DELIMS=" %%B In ('dir "%~1" /ad /S /B /OD') DO ( REM echo "%%B - " %%B REM within a FOR loop, better to use REM remarks than :: remarks (version-dependent) REM I believe the intention of the original here was to pick up the filedate REM It wouldn't work since FINDSTR is looking for lines that begin (/B) with REM 2 digits, a slash and one digit, but the date format about to be processed... REM For /F "TOKENS=1 DELIMS=%_TabSpace%" %%D In ('dir %1\"%%B" /ad /OD ^| findstr /B [0-9][0-9]/[0-9]') DO ( REM echo "%%D - " %%D REM Process date - 4 elements separated by space or /. Pick the last three REM so implictly format is DAYNAME xx/yy/zz BUT the elements would be applied REM to %%b, %%c, %%d, %%e REM for /F "tokens=1,2,3,4 delims=/ " %%b in ("%%D") do ( for /F "tokens=1,2,3,4 delims=/ " %%a in ("%%~tB") do ( REM echo "b = " %2\%%c%%a\%%b REM echo %2\%%d%%c\%%b REM Make a new directory. 2>nul suppresses error message if already exists md "%TARGET%\%%d%%c\%%b" 2>nul move "%%B" "%TARGET%\%%d%%c\%%b\" ) ) 

真正的噩梦 – 不知道你使用的是什么格式的日期,也不知道你想要什么格式的目标目录结构。 这应该是“扁平”的结构,所以任何文件filename.ext将被放置在%target%\xx\yy\zz而不管文件最初驻留在源结构中的哪个位置。 同样的filename.ext多个实例也没有相同的DATE但在源filename.ext的不同子目录中。 需要更多的澄清整个场景才能更确定。 真的只是评论和改变现有(推定工作,但明显错误)批次…

您也可以使用XCOPY函数来复制父文件夹和子文件夹。