PowerShell
BOX
boxcli
基幹システム

Box CLIを使ってファイルのUploadを自動化してみた

追記(2018.4.12)

Box APIエラーをstderrに返すようアップデートされました。
https://github.com/box/boxcli/issues/71#issuecomment-380579922
これでエラーハンドリングが捗りますね。

Box CLIを使ってファイルの自動アップロード

基幹システム等から定期的に出力されるファイルを自動的にBoxにアップロード出来るようにしたいという要望を最近良く耳にします。
基幹システムからBoxに直接アップロード出来たらいいけど、基幹システムに手加えるのはなかなか気が引ける。せやな。分かる

ファイルサーバーの指定のフォルダにファイルを吐き出しているから、そこからBoxにアップロードする方法があればいいなー。

Box Drive使えばいいんじゃない?って声が聞こえてきますが、Box Driveは大量のファイルの同期にあまり向いていません。同期ファイル数が多くなってくるとCPUとメモリリソースを消費しがちです。

あと、Box DriveはWindows Serverにインストールできないです。インストールしようとすると弾かれます。

サードパーティ製のファイル移行ツールを使うという手もありますが、少なくとも数十万単位のコストがかかってしまうので、お金がない人には厳しいです(´・ω・`)

Box SDKを使ってアプリを開発するにも、環境を構築している余裕はない。

そこで、Box CLIの登場です。

Box CLIとPowerShellを使ってフォルダを監視して、検知したファイルをBoxにアップロードするスクリプトを書いてみました。

スクショ

動作デモ動画撮りました。ファイルサイズがでかくなりすぎて、ちょっと重たいです。

スクリプト

autoUploader.ps1
$folder = 'C:\定期出力' #<= 監視したいフォルダを指定
$filter = '*.*'  #<= フィルターの設定

#[ファイル検知について](https://msdn.microsoft.com/en-us/library/system.io.notifyfilters(v=vs.110).aspx)                       
$fsw = New-Object IO.FileSystemWatcher $folder, $filter -Property @{
 IncludeSubdirectories = $false    #<= サブフォルダまで監視するかどうかを指定         
 NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite' 
}

#ファイル作成イベントの登録 - イベントの監視を停止するには、Unregister-Event -SourceIdentifier FileCreated
$onCreated = Register-ObjectEvent $fsw Created -SourceIdentifier FileCreated -Action {
 $path = $Event.SourceEventArgs.FullPath
 $name = $Event.SourceEventArgs.Name
 $changeType = $Event.SourceEventArgs.ChangeType
 $timeStamp = $Event.TimeGenerated

 Write-Host "$path の出力検知しました。Boxにアップロードします"

 #box cliのコマンド。今回はエラーの例外処理はしていないが、box cliのエラーを処理するには少し工夫が必要。後述します
 box files upload $path -p 47880544930 #Box上の特定フォルダにアップロード 

 Write-Host "Boxにアップロードしました"
 }

注意事項

標準エラーに返すようアップデートされました。

Box CLIは、Box APIを叩いた結果を全てJSONで標準出力にかえしてしまいます。
Box CLI自体がバグったときだけ、標準エラーに返します。

APIを実行した結果BoxがHttp status code 4xx系を返したとしても、標準出力です。
標準出力に返されるJSONを解析しないといけなので、例外処理がめんどくさいのが痛いですね。
powershellだとConvertFrom-JSONとか使って出来るみたいですけど、powershellそんなに詳しくないので、誰か詳しい人いたら使い方教えてください!

おわり