0

我有一个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

但是这段代码无法处理子目录中的文件如何处理子目录文件,并将它们以相同的目录结构输出到另一个目录?谢谢帮助:)

4

2 回答 2

0

DIR /S选项将为您提供整个文件夹层次结构。而且您还希望/A-D选择从输出中抑制文件夹。键入HELP DIRDIR /?了解更多信息。

但是,我建议不要使用FOR /Fwith ,而是使用. 键入或了解更多信息。另请参阅http://judago.webs.com/batchforloops.htm以更容易理解该命令的解释。DIRFOR /RHELP FORFOR /?FOR

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

一些额外的提示:

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

这是包含所有建议的完成代码。编辑 - 原始代码不起作用。更改以解决 tiance 的评论

@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
于 2012-05-28T11:35:21.140 回答
0

你试过XCOPY sourcefolder destinationfolder /E吗?

于 2012-05-28T08:13:14.487 回答