ネットワーク越しの多数ファイルコピーが遅い
600~1000個くらいのファイルを遅めのネットワーク越しに送ることがよくある。
相手PCの特定のフォルダに置かれているべき設定ファイル一式、みたいなの。
これが遅くて、時間帯によっては5分くらいかかることもある。
完了まで見守るのがイヤ。
まとめてコピーしても実際の処理は1個ずつやってるんで遅いようだ。
アーカイブして送って、相手側で展開すれば早いよな。というわけで考える。
方針
ひとまずzipにまとめて相手側へコピーして単純に展開操作してみる。
遅い。
この操作だと相手側にあるzipを手元PCで展開して相手側へ保存してるので、1個ずつコピーしてるのと同じことである。
1.相手側へアーカイブを保存
2.相手側でアーカイブを展開
こうしなければ解決できない。
相手側へアーカイブを保存
権限あるので、管理共有使って送るだけ。
set /p HOSTNAME=
copy /y InitialSettings.zip \\%HOSTNAME%\c$\folder
相手側でアーカイブを展開
ここでしばらく悩んだ。
コマンドプロンプトの標準的な範囲でzipファイルは取り扱えない。
あれこれ追加すればできるものの、「相手側で」実行できなければならないので、相手側に余計な設定やファイルは残したくない。
PowerShellならExpand-Archive
で展開できるが、PowerShellは実行ポリシーとか相手側で実行とかが面倒だ。そもそもPowerShell使うなら最初から全部PowerShellで書きたいしいまさら(意地)。
ここは7-zipコマンドライン版を使うことにする。
https://7-zip.opensource.jp/howto/non-install-extract.html
単体で動作するので、7za.exeを相手側へコピーして、相手側で実行して、終わったら削除すればよい。
相手側で実行する
相手側でアーカイブ展開処理を実行するには、毎度おなじみpsexecを使う。
相手側で実行したい処理を別のbatに書き、-c
オプションを付けてやれば、「バッチをコピーして、相手側で実行」してくれる。
PsExec - Sysinternals
https://learn.microsoft.com/ja-jp/sysinternals/downloads/psexec
psexec \\%HOSTNAME% -c bat2.bat
@echo off
cd c:\folder
7za x -y InitialSettings.zip
del 7za.exe
del InitialSettings.zip
できあがり
@echo off
setlocal
cd %~dp0
echo 設定ファイルアーカイブをコピー 対象HOSTNAME入力
set /p HOSTNAME=
copy /y InitialSettings.zip \\%HOSTNAME%\c$\folder
copy /y 7za.exe \\%HOSTNAME%\c$\folder
psexec \\%HOSTNAME% -c bat2.bat
echo 終了確認 キー入力で終了
PAUSE
@echo off
cd c:\folder
7za x -y InitialSettings.zip
del 7za.exe
del InitialSettings.zip
数秒で終わるようになった。満足。