技術ブログというより日記です。
そもそもなんでそんなことする必要が出たかというと・・・。
AppExchangeのAアプリ⇒Bアプリ乗り換えのためデータ移行したい
Salesforseカスタムオブジェクトでデータを蓄積していくA社さんから
同じくカスタムオブジェクトへ蓄積していくB社さんへの乗り換えをすることになりました。
幸いデータは2万件弱なんですけども面倒なのが添付の画像ファイル。
念のためB社さんに「A社さんから移行された事例はお持ちではありませんかネー?」と資料をおねだりしてみるも
残念ながら、お詳しくないとのことー。
開発に確認するって言ってるうちに、こっちで調べてやってしまうことに。
ひとまず、A社さんは「添付ファイル」すなわちAttachiment
に画像を入れて、本文レコードへ紐づけ。
B社さんは「コンテンツドキュメント」ContentsDocument
に画像を保存していることがわかりました。
会社全体の本文レコードをごっそり引っ越したいので、
添付ファイルは「ウィークリーエクスポートサービス」機能を使ってダウンロードすることにします。
ウィークリーエクスポートサービスでのデータ抽出
オブジェクトだけ選択してエクスポートスケジュールの日時になるのを待ちました・・・。
が、全オブジェクトに紐づく全ファイルが吐かれるんですね!!
まじかー・・・。50MB超のZipが何十個もできとるーーーーーーー!
そしてどのZipになんのファイルが入っているか、Attachimentのcsvにも書いてないし
一覧表のテキストも作ってくれないしで
全部展開してもいいですけど、とはいえ、何千という画像ファイル手で探したくないですし・・・
と思ってBat化する流れに。
Zipのなかから所定のファイル名を拾い出すBat
とりま、対象のファイル名はattachimentファイルで割れているので、
どこのZipから解凍すればいいかを探索する方法を考えます。
ちなみにマクロは重くてダメでした。(そりゃそうか)
なのでBat化を試みたんですが。
展開せずにZipのまま検索するコマンドはインストールが必要なものしか見つかりませんでした。
Unzip
または7zip
の利用が必要で、下記はUnzipのコマンドを使って書いたBatファイル。
Zipの中身を除くコマンドをfor文でひたすら回します。
※ほんとはもっとエレガントな方法もあるよなーきっと(゜-゜)
実際にはこのあと、一覧化したファイル名をもとに
フォルダコピーを繰り返す処理を足して使ってました。
完成形の公開はいつかするかもくらいで。
とりま、2万けんくらいならラップトップでもなんとか動くよ。
あと、コンテンツ系の移植は
もう一本Bulkアップデート用のBatも作ってアップロード作業しました。
(ガバナ制限とかマナー的には頻繁に利用しないべきかもですが)
コンテンツのアップロードをデータローダでやろうとすると1回1000件までの制限があってだるいので
1000件未満でリストと切って、自動でアップロードするやつです。
慣れないので一回目はちょっと苦労しましたが
一回作っちゃえば、後はポチるだけなので移行作業どんとこいになりました。
データローダのコマンドライン使用は便利そうなので、今後ちゃんとまとめたいですね。
Trailblazersの諸兄がすでに書いてそうですが。
@echo off
rem ------------------------------
rem 実行前準備作業フォルダのパスを記入
set folderpath=C:\Users\うにゃうにゃ\Documents\
set filepath=SmartViscaf__image_id__c.txt
rem ------------------------------
echo filepathの値:%filepath%
echo folderpathの値:%folderpath%
rem フォルダ内のZip一覧を作成
dir %folderpath% /O /B > %folderpath%ziplist.txt
echo ziplist maked
rem Unzipのフォルダへ移動
cd C:\Program Files (x86)\GnuWin32\bin
rem 一覧記載のZipをすべて検索するループ
for /f %%a in (%folderpath%ziplist.txt) do call :forcall %%a
goto :sub
:forcall
rem For文内でやりたい処理
rem 拡張子:文末3桁の切り出して大文字でそろえる
set ext=%*
set ext=%ext:~-3%
set ext=%ext:z=Z%
set ext=%ext:i=I%
set ext=%ext:p=P%
rem 操作フォルダのパス設定
set zippath=%folderpath%%*
rem 吐き出しファイル名
set listname=list-%*.txt
set listname=%listname:.IP=%
rem 拡張子がZipなら処理実行
if "%ext%" == "ZIP" (
rem Zip内のファイル名すべて書き出す
unzip -l %zippath% > %folderpath%temp.txt
echo temp%* maked
rem ファイル名で該当するものを最終的な一覧に書き出す
for /f "tokens=6 delims= " %%a in (%folderpath%temp.txt) do call :makefilelist %%a
)
goto :eof
:makefilelist
rem For文内でやりたい処理 2
set filename=%*
set filename=%filename:Attachments/=%
echo ファイル名摘出:%filename%
for /f %%b in ( %folderpath%%filepath%) do (
if "%%b" == "%filename%" (
echo %filename% >> %folderpath%%listname%
)
)
goto :eof
:sub
rem '''終了処理
del %folderpath%temp.txt
del %folderpath%ziplist.txt
pause