PowerShellからS3に同期

うーん。
なんというか文字コードに悩まされた。
後はタスクスケジューラに仕込んで動くかどうかだが・・・・。

ちなみにそのままAWSのツールインストールすると文字化けするので
PythonからAWSのCLIは入れなおしてます。
http://dev.classmethod.jp/cloud/aws/awscli-for-windows/

んで、PowerShellではまるとは・・・。
ISEだと文字化けしないけどPowerShellコンソールから
動かすと日本語ファイルがあると文字化けするんだよな~。
けどイベントビューアに出力するようにしたから
start-transcript $logfileと日本語文字化けのとこはいいや・・・。

$frompath = "C:\Users\Administrator\Desktop\work"
$tosite = "s3:S3バケット名"
$logfile = "C:\work\Console.log"
$pythonpPath = "C:\Python34\Scripts"
$errKeyword = "Completed 1 part(s) with ... file(s) remaining"
$worningKeyword = "Completed 0 part(s) with ... file(s) remaining"

start-transcript $logfile
cd $pythonpPath
$result = .\aws s3 sync  $frompath $tosite
$result | Out-File $logfile -Append -Encoding utf8
stop-transcript

#S3から返されたエラーに応じた処理
switch  ($result){
  $errKeyword{ 
        $ErrMsg = "S3Syncでエラーが発生しました。バゲット接続エラー。"+ "`n" + $result 
        Write-EventLog -LogName S3Sync -EntryType Error -Source S3Sync -EventId 100 -Message $ErrMsg
        break
  }
  $worningKeyword{
        $WornMsg = "バックアップ元フォルダの名前が変更されている可能性があります。"+ "`n" + $result 
        Write-EventLog -LogName S3Sync -EntryType Warning -Source S3Sync -EventId 200 -Message $WornMsg
        break
  }
  default{
        $defMsg = "S3にファイルを同期しました。" + "`n" + $result
        Write-EventLog -LogName S3Sync -EntryType Information -Source S3Sync -EventId 0 -Message  $defMsg
        break
  }
}

cd "C:\"
chcp 932


タスクスケジューラに埋め込んで動かしたら問題なくトランスクリプト(コンソールログ)は文字列出力してくれたし、解決。ついでにイベントログ出力させるようにした。
最初に[New-EventLog -LogName S3Sync -Source S3Sync]しとく必要はある。
イベントログ出せたらコンソールログはコメントしといてもいいかもね。
switch文のところはbreak入れとかないとえらいことになります。
久しぶりに勉強になった。

コメント

Otazoman さんの投稿…
ちなみにログインしないユーザを作ってバッチ的に使おうとすると
システム環境変数にAWSのキー類を埋め込んでやらないと動かないから要注意

http://www.task-notes.com/entry/20141026/1414322858

このブログの人気の投稿

証券外務員1種勉強(計算式暗記用メモ)

GASでGoogleDriveのサブフォルダとファイル一覧を出力する

マクロ経済学(IS-LM分析)