1

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

问题是源文件夹包含子文件夹,批处理命令不能递归到子文件夹。

请告知如何修改批处理文件以允许递归到源文件夹上的子文件夹。

谢谢

里亚莱

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 /a-d /B /OD') DO (
REM echo "%%B - " %%B 

For /F "TOKENS=1 DELIMS=%_TabSpace%" %%D In ('dir %1\"%%B" /a-d /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\ 

)

)

)
4

2 回答 2

1

尝试使用

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

/s导致递归。缺点是dir命令的输出是 then d:\path\file.ext- 这可能与您的"TOKENS=1 DELIMS=%_TabSpace%". 您可能需要使用"delims="(即,没有分隔符,因此 token1 中的整行)。

然后,您可以将完整文件名的各个部分检索为%%~dB%%~pB和(驱动器、路径、naem 和扩展名 - 如果您愿意,可以使用for name+extension 组合这些部分,例如。%%~nB%%~xB%%~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 (/a-d) 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" /a-d /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" /a-d /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.extDATE

于 2013-08-09T06:15:19.253 回答
0

您还可以使用 XCOPY 功能复制父文件夹和子文件夹。

于 2013-08-14T20:00:13.670 回答