繁体   English   中英

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

[英]Batch Command to Move Files from Sub Directories to New Directory

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

问题在于源文件夹包含子文件夹,并且批处理命令无法递归到子文件夹中。

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

谢谢

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\ 

)

)

)

尝试使用

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 〜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 (/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 对于具有相同DATE但在源中的不同子目录中的相同filename.ext多个实例,也没有任何保护措施。 需要对整个场景进行更多的澄清才能更加确定。 真的只是评论和更改现有(假定工作正常但显然有问题的)批处理...

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM