ローカルフォルダ配下のファイルをBLOBに一括アップロードするbatファイルを作る
はじめに
BLOBストレージにファイルを一括アップロードできるbatファイルが必要になったので、作りました。
今回作るもの
特定のローカルフォルダ配下にある複数のファイルを、一括でBLOBストレージにアップロードするPowerShellスクリプトを作ります。
また、それを起動させるbatファイルまで作ります。
用意するもの
アップロード先のBLOBストレージ
Azure CLIが使用できるWindows環境
参照サイト様
Windows での Azure CLI のインストール | Microsoft Docs
az storage blob | Microsoft Docs
PowerShell のエラーコード処理 | netplanetes log
作成
ログインスクリプト
Azureにアクセスするためのログインスクリプトを作ります。
PowerShellからのログイン自体は下記コマンドでできます。
az login -u ユーザー名 -p パスワード
このコマンドを.ps1ファイルに記載します。
また、ユーザ名とパスワードは入力形式にしたいので変数化します。
パスワードは入力しているときに平文を表示したくないので、[-AsSecureString]のオプションを付けます。
$username = Read-Host "Azureアカウント"
$password = Read-Host "パスワード" -AsSecureStringaz login -u $username -p $password
これにより、スクリプト実行時には下記のような表示になります。
以上でログイン用のスクリプトはできました。
最終的なスクリプトの形は下記のGitHubを参照ください。
blob_upload_bat/login.ps1 at master · kgnk-hkr/blob_upload_bat · GitHub
アップロードのためのスクリプト
次に指定したファイルを指定したBLOBストレージにアップロードするスクリプトを作ります。
BLOBへのアップロード自体は下記コマンドでできます。
az storage blob upload-batch --account-name ストレージアカウント名 -d アップロード先のコンテナ名 --destination-path アップロード先のパス -s アップロード元のローカルフォルダパス
[アップロード元のローカルフォルダパス]を指定すると、そのフォルダ配下のファイルすべてがアップロードされます。
ログインスクリプト同様、アップロードに必要な情報は変数化します。
今回は、デフォルト値も利用したいため、デフォルト値のオプションも利用します。
Read-Hostを付けることで、対話的になるためよりユーザーに分かりやすくできます。
$defaultaccountname = 'defaultaccountname' ←これがデフォルト値
$accountname = Read-Host "ストレージアカウント名[デフォルト値:$($defaultaccountname)]"
$accountname = ($defaultaccountname,$accountname)[[bool]$accountname]$defaultcontainername = '$web' ←これがデフォルト値
$containername = Read-Host "コンテナ名[デフォルト値:$($defaultcontainername)]"
$containername = ($defaultcontainername,$containername)[[bool]$containername]$defaultdestinationpath = '/images/' ←これがデフォルト値
$destinationpath = Read-Host "アップロード先のパス[デフォルト値:$($defaultdestinationpath)]"
$destinationpath = ($defaultdestinationpath,$destinationpath)[[bool]$destinationpath]$sourcepath = Read-Host "アップロード元のフォルダーパス"
az storage blob upload-batch --account-name $accountname -d $containername --destination-path $destinationpath -s $sourcepath
このスクリプトを実行すると下記のようになります。
アップロードに最低限必要なのは以上ですが、
きちんとアップロードされたかを実行の前後で確認できるようにアップロード先のファイル一覧を取得するコマンドも追加します。
$date = (Get-Date -F G).Replace('/','').Replace(' ','_').Replace(':','');
$destbefore = $date + "_before_upload_list.txt"
$destafter = $date + "_after_upload_list.txt"az storage blob list --account-name $accountname --container-name $containername --output table --prefix $destinationpath > $destbefore
az storage blob list --account-name $accountname --container-name $containername --output table --prefix $destinationpath > $destafter
以上でファイルアップロード用のスクリプトはできました。
最終的なスクリプトの形は下記のGitHubを参照ください。
blob_upload_bat/FileUpload.ps1 at master · kgnk-hkr/blob_upload_bat · GitHub
2つのスクリプトを実行するためのbatファイル
上記2つのPowerShellスクリプトを実行するためのbatファイルを作ります。
2つのPowerShellスクリプトはbatファイルと同じ階層のフォルダに格納されていることとします。
スクリプトが失敗したときにはエラーメッセージを返すようにします。
少し長くなるので、コード自体はGitHubにて参照ください。
blob_upload_bat/Upload.bat at master · kgnk-hkr/blob_upload_bat · GitHub
このbatファイルを実行し、すべてのスクリプトが成功すると下記のようになります。
ちなみに、スクリプトが失敗すると下記のようになります。
Azureへのログインが失敗した場合
アップロード情報が間違っていてアップロードに失敗した場合
詰まったところ
スクリプトのエラー検出
上記で説明したようなコマンドをそのままスクリプトにした状態では、アップロードスクリプトが失敗していても、エラーとして検出されずに終えられてしまいました。
下記記事を参考にして、1処理ごとにデータが返されているかを確認するようにしました。
Using Azure CLI with PowerShell: error handling explained
フォルダ名に記号が入っている場合
コマンドでアップロードする場合に、アップロード先のコンテナ名に記号($など)が入っていると、ダブルクォーテーションで囲うとコマンドが通らない事象がありました。
下記の記事を参考に、シングルクォーテーションで囲ったらうまくいきました。
おわりに
エラー処理の部分などは結構苦労したのですが、細かなところは端折ってしまったので、完成形のものをご覧いただければと思います。
気力があればちゃんと書き起こします。
作成したスクリプトとbatファイルはGitHubにまとめてアップしています。