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

しかし、このコードはサブディレクトリ内のファイルを処理できませんサブディレクトリファイルを処理し、同じディレクトリ構造で別のディレクトリに出力するにはどうすればよいですか?ヘルプのためのthx:)

4

2 に答える 2

0

試しましたXCOPY sourcefolder destinationfolder /Eか?

于 2012-05-28T08:13:14.487 に答える
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は必要ありませんが、とにかく入るのはおそらく良い習慣です。

これがすべての提案を含む完成したコードです。編集-元のコードは機能しませんでした。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 に答える