用于将文件从子目录移动到新目录的批处理命令

时间:2013-08-09 05:18:30

标签: windows batch-file cmd

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

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

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

由于

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 /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\ 

)

)

)

2 个答案:

答案 0 :(得分:1)

尝试使用

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

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

然后,您可以将完整文件名的各个部分检索为%%~dB%%~pB%%~nB%%~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 (/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.ext但在源中的不同子目录中的相同DATE的多个实例,也没有保护。需要对整个场景进行更多澄清才能更加确定。真的只是评论和改变现有的(推测工作但明显错误的)批次......

答案 1 :(得分:0)

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