【備忘録】バッチファイル10行でデータローダを定期的に実行する


少し前にデータローダバッチを動かしてみたことはありましたが、バッチファイルを作って定期実行したことはこれまでになかったので備忘録でまとめておきます。


# 1.ディレクトリ構成
```
  |
  |-- batchTEST
      |
      |-- configs
          |
          |-- log-conf.xml
          |
          |-- process-conf.xml
      |
      |-- Extract
      |
      |-- Log
      |
      |-- batchTest.cmd
      |
      |-- dataLoader.key
```

## log-conf.xml
これは level="INFO"に変更しただけです。
ほかにも設定値はありますが、情報量が多すぎるのでINFOでちょうど良いかと思います。

## process-conf.xml
設定値の詳細は以下からご確認ください。
https://developer.salesforce.com/docs/atlas.ja-jp.dataLoader.meta/dataLoader/loader_params.htm

パスワードは暗号化が必要ですので以下からご確認ください。
https://help.salesforce.com/s/articleView?id=000331524&type=1

ワンポイントとしてdataAccess.nameの設定は今回不要です。
batchTest.cmdで直接指定しファイル名＋日付で動的な名前になるようにしています。

```process-conf.xml
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
    <bean id="AccountExtract" class="com.salesforce.dataloader.process.ProcessRunner" scope="prototype">
        <property name="name" value="AccountExtract"/>
        <property name="configOverrideMap">
            <map>
            	<!-- Sandboxの場合はhttps://test.salesforce.com -->
                <entry key="sfdc.endpoint" value="https://login.salesforce.com"/>
                <entry key="sfdc.username" value="(Salesforceユーザー名)"/>
                <entry key="sfdc.password" value="(暗号化したパスワード)"/>
                <entry key="process.encryptionKeyFile" value="C:\batchTEST\dataLoader.key"/>
                <entry key="sfdc.timeoutSecs" value="600"/>
                <entry key="sfdc.loadBatchSize" value="200"/>
                <entry key="sfdc.entity" value="Account"/>
                <entry key="sfdc.extractionRequestSize" value="500"/>
                <entry key="sfdc.extractionSOQL" value="Select Id, Name, Type, ParentId, Phone, AccountNumber, Website, Sic, AnnualRevenue, NumberOfEmployees, TickerSymbol FROM Account"/>
                <entry key="process.operation" value="extract"/>
                <entry key="dataAccess.type" value="csvWrite"/>
                <entry key="process.enableLastRunOutput" value="fase"/>
                <!-- 直接ファイル名をcmdファイルより指定してExportするので今回は不要 -->
                <!-- <entry key="dataAccess.name" value="C:\batchTEST\Log\extract.csv"/> -->
                <!-- プロキシが必要であれば別途設定する必要がある。 -->
            </map>
        </property>
    </bean>
    <bean id="ContactExtract" class="com.salesforce.dataloader.process.ProcessRunner" scope="prototype">
       <property name="name" value="csvContactExtract"/>
       <property name="configOverrideMap">
           <map>
               <entry key="sfdc.endpoint" value="https://login.salesforce.com"/>
               <entry key="sfdc.username" value="(Salesforceユーザー名)"/>
               <entry key="sfdc.password" value="(暗号化したパスワード)"/>
               <entry key="process.encryptionKeyFile" value="C:\batchTEST\dataLoader.key"/>
               <entry key="sfdc.timeoutSecs" value="600"/>
               <entry key="sfdc.loadBatchSize" value="200"/>
               <entry key="sfdc.entity" value="Contact"/>
               <entry key="sfdc.extractionRequestSize" value="500"/>
               <entry key="sfdc.extractionSOQL" value="Select Id, IsDeleted, MasterRecordId, AccountId, LastName, FirstName, Salutation, Name, OtherStreet, OtherCity, OtherState, OtherPostalCode, OtherCountry, OtherLatitude, OtherLongitude, OtherGeocodeAccuracy, OtherAddress, MailingStreet, MailingCity, MailingState, MailingPostalCode, MailingCountry, MailingLatitude, MailingLongitude, MailingGeocodeAccuracy, MailingAddress, Phone, Fax, MobilePhone, HomePhone, OtherPhone, AssistantPhone, ReportsToId, Email, Title, Department, AssistantName, LeadSource, Birthdate, Description, OwnerId, CreatedDate, CreatedById, LastModifiedDate, LastModifiedById, SystemModstamp, LastActivityDate, LastCURequestDate, LastCUUpdateDate, LastViewedDate, LastReferencedDate, EmailBouncedReason, EmailBouncedDate, IsEmailBounced, PhotoUrl, Jigsaw, JigsawContactId, CleanStatus, IndividualId FROM Contact"/>
               <entry key="process.operation" value="extract"/>
               <entry key="dataAccess.type" value="csvWrite"/>
               <entry key="process.enableLastRunOutput" value="fase"/>
               <!-- 直接ファイル名をcmdファイルより指定してExportするので今回は不要 -->
               <!-- <entry key="dataAccess.name" value="C:\batchTEST\Log\extract2.csv"/> -->
               <!-- プロキシが必要であれば別途設定する必要がある。 -->
           </map>
       </property>
    </bean>
</beans>
```

## Extract
このフォルダにcsvファイルを格納します

## Log
このフォルダにログファイルを格納します

## batchTest.cmd
なるべくシンプルに作ると10行でまとまり以下のような感じになるかと思います。

```batchTest.cmd
set CONF=C:\batchTEST\configs
set EXPORT=C:\batchTEST\Extract
set JARPATH=C:\(path)\dataloader-54.0.0-uber.jar
set JAVA_EXE_PATH="C:\Program Files\Zulu\zulu-11\bin\java.exe"
set YYYYMMDD=%DATE:/=%
set LOGPATH=C:\batchTEST\Log\LogResult_%YYYYMMDD%.log
type nul > %LOGPATH%
cd %EXPORT%
call %JAVA_EXE_PATH% -cp %JARPATH% com.salesforce.dataloader.process.DataLoaderRunner salesforce.config.dir=%CONF% run.mode=batch process.name=AccountExtract dataAccess.name=AccountExport_%YYYYMMDD%.csv >> %LOGPATH%
call %JAVA_EXE_PATH% -cp %JARPATH% com.salesforce.dataloader.process.DataLoaderRunner salesforce.config.dir=%CONF% run.mode=batch process.name=ContactExtract dataAccess.name=ContactExport_%YYYYMMDD%.csv >> %LOGPATH%

```
バッチファイルの作り方の詳細は省きます。

ワンポイントでコマンドでもファイル名と保存場所を指定出来るので、これで動的なファイル名にすることが可能です。またきちんと動作したかどうかはログファイルで確認できるようにしています。

定期実行するためにタスクスケジューラに登録すれば定期的に実行してくれます。

こちらも詳細の説明は省きます。ファイル名を動的に設定しているため、毎日実行しても上書きすることもなく、運用が楽になるかと思います。

## dataLoader.key
以下を参照ください。
https://help.salesforce.com/s/articleView?id=000331524&type=1