如何编写bat文件来处理所有文件包括子目录,并将它们与相同的目录结构输出到另一个目录?

时间:2012-05-28 07:57:30

标签: batch-file

我有一个bat文件来处理目录下的所有文件,并输出到另一个目录

这是bat文件中的代码

@set dir1=mulit-simp\
@set dir2=mulit-trad\
@cd /d %~dp0
@if not exist %dir1% md %dir1%
@if not exist %dir2% md %dir2%
@for /f "delims=" %%i in ('dir %dir1%*.* /b') do @opencc.exe --input="%dir1%%%i" --output="%dir2%%%i"
@echo.
@echo Done!
@echo.
@pause

但此代码无法处理子目录中的文件 我如何处理子目录文件,并使用相同的目录结构将它们输出到另一个目录? thx求助:)

2 个答案:

答案 0 :(得分:0)

您是否尝试过XCOPY sourcefolder destinationfolder /E

答案 1 :(得分:0)

DIR /S选项将为您提供整个文件夹层次结构。并且您还希望/A-D选项禁止输出中的文件夹。输入HELP DIRDIR /?了解详情。

但是,我推荐使用FOR /F,而不是将DIRFOR /R一起使用。输入HELP FORFOR /?了解详情。另请参阅http://judago.webs.com/batchforloops.htm以便于理解FOR命令的解释。

无论哪种方式,您还需要创建所有目标文件夹。最简单的方法是在处理文件之前使用XCOPY /T /E创建目标文件夹。

一些额外提示:

  • 只需将@echo off放在顶部,而不是使用@
  • 为每个命令添加前缀
  • ECHO.已被广泛使用多年,但它实际上可能无法正常工作。更安全地使用ECHO(
  • 您可能不希望定义的环境变量在批处理完成后挂起。将SETLOCAL置于顶部将使变量成为临时变量,并且只有在批处理文件完成或执行ENDLOCAL之前它们才会存在。鉴于您最后使用PAUSE,我怀疑您是通过双击文件或快捷方式运行批处理文件。如果是,则命令窗口在结束时关闭,变量随之消失。然后不需要SETLOCAL,但无论如何仍然是一个很好的做法。

以下是包含所有建议的已完成代码。 编辑 - 原始代码不起作用。改变以解决未婚夫的评论

@echo off
setlocal
set dir1=mulit-simp
set dir2=mulit-trad
cd "%~dp0"

:: Replicate tree
if not exist "%dir1%" md "%dir1%"
if not exist "%dir2%" md "%dir2%"
xcopy /t /e "%dir1%" "%dir2%"

:: Get length of absolute path of %dir1%
<nul set /p "=%cd%\%dir1%" >getLength.tmp
for %%F in (getLength.tmp) do set len=%%~zF
del getLength.tmp

:: Process the files
for /r "%dir1%" %%F in (*) do (
  set "src=%%F"
  setlocal enableDelayedExpansion
  opencc.exe --input="!src!" --output="%dir2%!src:~%len%!"
  endlocal
)
echo(
echo Done!
echo(
pause