この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