はじめに
ほぼ毎朝フォルダごとローカルにコピーすることがあるので自動化しました。使うだけであればまとめをご覧ください。
この記事で紹介すること
- フォルダのコピー
- 最新フォルダの特定
- まとめ
- 補足:自動化手順
フォルダのコピー
ストレージ\\hoge\hogehoge\kore
のkore
フォルダ以下をバッチファイルのある場所にコピーしたい。
以下サンプルでデスクトップにkore
フォルダが作られ、中身がコピーされる。
@rem 【コピー元パス】.
set StoragePass=\\hoge\hogehoge\kore
@rem 【コピー先パス】.
set LocalPass=C:\Users\namae\Desktop\kore
@rem 実行.
xcopy "%StoragePass%" "%LocalPass%" /s/e/i
オプション(/s/e/i
)に関して詳しくはこちら
最新フォルダの特定
ストレージにどんどん新しいものが作られる状況があるはず。。
タイムスタンプを見て最新フォルダを特定しましょう
@rem 最新版のフォルダを検索.
@rem 初期値は十分に古ければ問題ない.
set Latest_Timestamp="2018/01/01 00:00"
set StoragePass=\\hoge\hogehoge
setlocal EnableDelayedExpansion
for /F %%a in ('dir /B /A:D /O-N "%StoragePass%"') do (
set DirName=%%a
for %%i in ( "!StoragePass!\!DirName!" ) do (
if !Latest_Timestamp! lss %%~ti (
set Latest_Timestamp=%%~ti
set Latest_dir=!DirName!
)
)
)
echo %Latest_dir%
pause
これで\\hoge\hogehoge
にある最新のフォルダ名が得られる。
まとめ
二つを組み合わせるとストレージにある最新フォルダを丸ごとコピーできるようになります。
パスの登録バッチと実行バッチを分けると不幸な事故を防げます。
同じフォルダにuser_settings.bat
,copy.bat
,get_latest_dir.bat
を置いて、copy.bat
を叩きましょう。
@rem 【コピー元パス】.
set StoragePass=\\hoge\hogehoge
@rem 【コピー先パス】.
set LocalPass=%~dp0
echo off
@rem copy.batの方でEnableDelayedExpansionを読んでいるのでここでは不要.
@rem setlocal EnableDelayedExpansion
@rem 最新版のファイルを検索.
set Latest_Timestamp="2018/01/01 00:00"
for /F %%a in ('dir /B /A:D /O-N "%StoragePass%"') do (
set DirName=%%a
for %%i in ( "!StoragePass!\!DirName!" ) do (
if !Latest_Timestamp! lss %%~ti (
set Latest_Timestamp=%%~ti
set Latest_dir=!DirName!
)
)
)
goto END
:END
echo off
setlocal EnableDelayedExpansion
if not exist user_settings.bat (
echo user_settings.bat が見つかりません。
goto END
)
@rem 設定値の取得.
call user_settings.bat
@rem 最新版のファイルを検索.
call get_latest_dir.bat
@rem 指定フォルダ以下をコピー.
xcopy "!StoragePass!\!Latest_dir!" "%LocalPass%!Latest_dir!" /s/e/i/y
goto END
:END
pause
補足:自動化手順
バッチファイルを作ったけど毎回叩くのめんどくさいという人も多いと思います。
そんな時はタスクスケジューラを使えば指定した時間に実行してくれます。
意外と設定でミスってしまうことがあるのでこちらを見てやってみてください。
(私は作業フォルダーの設定を忘れて苦しみました。。)
おわりに
初心者なので、解説もなくリンクを張った備忘録みたいになってしまいましたが、もっとこうしたほうが良いなどコメント頂けると嬉しいです。