BATファイルで日付をファイル名に使用
以下のようにバッチでファイル名に、YYYYMMDD-hhmiss を付与する。
Set DD=%date:~0,4%%date:~5,2%%date:~8,2% set time2=%time: =0% Set TT=%time2:~0,2%%time2:~3,2%%time2:~6,2% move logerr.log logerr_%DD%_%TT%.log move logstd.log logstd_%DD%_%TT%.log
以下のようにバッチでファイル名に、YYYYMMDD-hhmiss を付与する。
Set DD=%date:~0,4%%date:~5,2%%date:~8,2% set time2=%time: =0% Set TT=%time2:~0,2%%time2:~3,2%%time2:~6,2% move logerr.log logerr_%DD%_%TT%.log move logstd.log logstd_%DD%_%TT%.log
netsh を使って下図のようにポート転送を設定。

1.コマンドプロンプトで以下を実行
netsh interface portproxy add v4tov4 listenport=待ち受けポート listenaddr=自分のIP(127.0.0.1じゃないほう) connectport=転送先ポート connectaddress=転送先のIP
2. 上記定義の削除
netsh interface portproxy delete v4tov4 listenport=待ち受けポート listenaddr=自分のIP(127.0.0.1じゃないほう)
iptablesを使って下図のようにポート転送を設定。

1.Linuxで転送設定を追加
# sysctl -w net.ipv4.ip_forward=1 # echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
2.iptablesの定義を追加
#iptables -t nat -A PREROUTING -m tcp -p tcp --dst WAITING_ADDR --dport WAITING_PORT -j DNAT --to-destination DET_ADDR:DEST_PORT #iptables -t nat -A POSTROUTING -m tcp -p tcp --dst DEST_ADDR --dport DEST_PORT -j SNAT --to-source WAITING_ADDR
1.Using refreshtoken
#!/bin/sh
MY_INSTANCE="******"
CLIENT_ID="*** your client id ***"
CLIENT_SECRET="*** your client secret ***"
REFRESH_TOKEN="*** your refresh token ***"
#----------------------------------------------
# Get Access token from Refresh token.
#----------------------------------------------
RESULT=`curl -X POST https://$MY_INSTANCE.my.salesforce.com/services/oauth2/token -d "grant_type=refresh_token" -d "client_id=$CLIENT_ID" -d "client_secret=$CLIENT_SECRET" -d "refresh_token=$REFRESH_TOKEN"`
ACCESS=`echo $RESULT | awk 'BEGIN{FS="access_token\":"}{print $2}' |awk 'BEGIN{FS=","}{print $1}' | sed -s 's/\"//g'`
#----------------------------------------------
#Get data using Access token
#----------------------------------------------
curl -s https://$MY_INSTANCE.my.salesforce.com/services/data/v52.0/sobjects/Account -H "Authorization: Bearer $ACCESS" -H "Content-type: application/json"
リフレッシュトークン自体を取得するには、Salesforceでリフレッシュトークを取得する を参照のこと。
ServiceNowのIncidentを curlで取得するサンプル
1. userid, passwordを使うパターン
#!/bin/sh
MY_INSTANCE="**** your instance ****"
CLIENT_ID="**** your instance ****"
CLIENT_SECRET="**** your instance ****"
USER="** your userid **"
PASSWD="*** your password ***" # !!warning. you might need to escape it.
#----------------------------------------------
# Get Access token from Id,Passwd
#----------------------------------------------
RESULT=`curl -X POST https://$MY_INSTANCE.service-now.com/oauth_token.do -H "Content-type: application/x-www-form-urlencoded" -d "grant_type=password" -d "client_id=$CLIENT_ID" -d "client_secret=$CLIENT_SECRET" -d "username=$USER" -d "password=$PASSWD"`
ACCESS=`echo $RESULT | awk 'BEGIN{FS="access_token\":"}{print $2}' | awk 'BEGIN{FS=","}{print $1}'| sed -s 's/\"//g'`
#----------------------------------------------
#Get Incident with using Access token
#----------------------------------------------
curl -s "https://$MY_INSTANCE.service-now.com/api/now/table/incident?sysparam_query=&sysparam_view=&sysparam_fields=sys_id%2Cshort_description" -H "Authorization: Bearer $ACCESS" -H "Content-Type: application/json"
2. refresh token を使うパターン
#!/bin/sh MY_INSTANCE="**** your instance ****" CLIENT_ID="**** your instance ****" CLIENT_SECRET="***** your instance ****" REFRESH_TOKEN="****your refresh token ****" #---------------------------------------------- # Get Access token from Refresh token. #---------------------------------------------- RESULT=`curl -X POST https://$MY_INSTANCE.service-now.com/oauth_token.do -d "grant_type=refresh_token" -d "scope=useraccount" -d "client_id=$CLIENT_ID" -d "client_secret=$CLIENT_SECRET" -d "refresh_token=$REFRESH_TOKEN"` ACCESS=`echo $RESULT | awk 'BEGIN{FS="access_token\":"}{print $2}' | awk 'BEGIN{FS=","}{print $1}'| sed -s 's/\"//g'` #---------------------------------------------- #Get Incident with using Access token. #---------------------------------------------- curl -s "https://$MY_INSTANCE.service-now.com/api/now/table/incident?sysparam_query=&sysparam_view=&sysparam_fields=sys_id%2Cshort_description" -H "Authorization: Bearer $ACCESS" -H "Content-Type: application/json"
3. リフレッシュトークンを取得する方法
OAuth2.0 Authorization code flow を使って リフレッシュトークンを取得する方法は以下を参照。
BLOBストレージ上のcsvファイルをパイプライン変数に格納する例。
csvファイルの内容をjsonにしてWeb Accessアクティビティに使用したい場合。
本来は、Copyアクティビティを使って変換するが、Copyアクティビティではできないような細かな処理を行いたい場合に、無理やり文字列操作で実現する。
この処理の場合、改行コードなどJSONでエスケープしなければならない文字列を全て自前でエスケープする必要がある。
1.BLOBストレージ上のCSVファイル
"name01","value01"
"name02","value02"
2.変換後のjson
{
"records" : [
{ "id" : "name01", "info" : "value01"},
{ "id" : "name02", "info" : "value02"}
]
}
3. パイプライン
3.1. パイプライン変数
BUFFER_V1_1 String
BUFFER_V1_2 String
BUFFER_V1_3 String
3.2. パイプライン構成

3.3. Lookup1 (参照)
3.4. ForEach1 (繰り返し)
@activity('Lookup1').output.value
3.5. Set V1 (変数の設定)
@concat(variable('BUFFER_V1_2'), '{"id":"', ESCAPE(item().Prop_0), '","info":"', ESCAPE(item().Prop_1),'"}')
ここで、上記 ESCAPE()の部分は実際には以下の記述になる。
uriComponentToString(replace(replace(replace(replace(replace(urlComponent(coalesce( *** , ”)),’%5C’,’%5C%5C’), ‘%22′,’%5C%22’), ‘%0D’,’%5Cr’), ‘%0A’, ‘%5Cn’), ‘%09’, ‘%5Ct’))
replace(**, ‘%5C’,’%5C%5C) ….. “\”を”\\”に置換
replace(**, ‘%22’,’%5C%22) ….. “”” を “\””に置換
replace(‘**’, ‘%0D’,’%5Cr’) …. \rを “\r”に置換
replace(‘**’, ‘%0A’,’%5Cn’) …. \nを “\n”に置換
replace(‘**’, ‘%09′,’%5Ct’) ….. \t を “\t”日間
3.6. Set V2 (変数の設定)
@concat(variable('BUFFER_V1_1'), ',')
3.7. Set V3 (変数の設定)
@concat(variable('BUFFER_V1_3'), '{ "records" [', variable('BUFFER_V1_1'),'}')
以上で、上記パイプラインが終わったあとに、変数 BUFFER_V1_31には、返還後のjson文字列が入っている。
■関連記事
csvをjsonにCopy アクティビティを使って変換 (Azure Data Factory)
BLOBストレージ上のjsonファイルをパイプライン変数に格納する例。
jsonファイルの内容を少し変えて(キー名等を変えて)Web Accessアクティビティに使用したい場合。
本来は、Copyアクティビティを使って変換するが、Copyアクティビティではできないような細かな処理を行いたい場合に、無理やり文字列操作で実現する。
この処理の場合、改行コードなどJSONでエスケープしなければならない文字列を全て自前でエスケープする必要がある。
1.BLOBストレージ上のjsonファイル
{
"datarecords" : [
{ "name" : "name01", "value" : " value01" },
{ "name" : "name02", "value" : "value02" }
]
}
2.変換後のjson
{
"records" : [
{
"attr" : { "rid" : "name01"},
"id" : "name01",
"info" : "value01"
},
{
"attr" : { "rid" : "name01"},
"id" : "name02",
"info" : "value02"
}
]
}
3. パイプライン
3.1. パイプライン変数
BUFFER_V1_1 String
BUFFER_V1_2 String
BUFFER_V1_3 String
3.2. パイプライン構成

3.3. Lookup1 (参照)
3.4. ForEach1 (繰り返し)
@activity('Lookup1').output.value[0].datarecords
3.5. Set V1 (変数の設定)
@concat(variable('BUFFER_V1_2'), '{ "attr":{ "rid": "', ESCAPE(item().name), '"}, "id":"', ESCAPE(item().name), '","info":"', ESCAPE(item().value),'"}')
ここで、上記 ESCAPE()の部分は実際には以下の記述になる。
uriComponentToString(replace(replace(replace(replace(replace(urlComponent(coalesce( *** , ”)),’%5C’,’%5C%5C’), ‘%22′,’%5C%22’), ‘%0D’,’%5Cr’), ‘%0A’, ‘%5Cn’), ‘%09’, ‘%5Ct’))
replace(**, ‘%5C’,’%5C%5C) ….. “\”を”\\”に置換
replace(**, ‘%22’,’%5C%22) ….. “”” を “\””に置換
replace(‘**’, ‘%0D’,’%5Cr’) …. \rを “\r”に置換
replace(‘**’, ‘%0A’,’%5Cn’) …. \nを “\n”に置換
replace(‘**’, ‘%09′,’%5Ct’) ….. \t を “\t”日間
3.6. Set V2 (変数の設定)
@concat(variable('BUFFER_V1_1'), ',')
3.7. Set V3 (変数の設定)
@concat(variable('BUFFER_V1_3'), '{ "records" [', variable('BUFFER_V1_1'),'}')
以上で、上記パイプラインが終わったあとに、変数 BUFFER_V1_31には、返還後のjson文字列が入っている。