我有一个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求助:)
答案 0 :(得分:0)
您是否尝试过XCOPY sourcefolder destinationfolder /E
?
答案 1 :(得分:0)
DIR /S
选项将为您提供整个文件夹层次结构。并且您还希望/A-D
选项禁止输出中的文件夹。输入HELP DIR
或DIR /?
了解详情。
但是,我推荐使用FOR /F
,而不是将DIR
与FOR /R
一起使用。输入HELP FOR
或FOR /?
了解详情。另请参阅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