0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PowerShellにおけるAZCopyのエラーハンドリング

Last updated at Posted at 2025-01-29

概要

PowerShellでazcopyを使用することでローカルのファイルを簡単にAzureBlobにコピーすることができます。
しかし、エラーが発生した場合のエラーハンドリングがうまくいかないことがあったのでそのエラーハンドリングについて記述します。

エラーの内容

下のようなコードを実行しました。

try {
    $filePath = "C:\Users\user\Desktop\test.zip"
    # SASトークン
    $SASToken = "https://storageaccount.blob.core.windows.net/container/test.zip"
    azcopy copy $filePath $SASToken --recursive=true
} catch {
    Write-Error "AZCopyのエラーが発生しました。"
    Write-Error $_.Exception.Message
}

ここでSASTokenの権限を変更して、azcopyのエラーを意図的に発生させて、エラーハンドリングを正しく行うかのテストを行おうとしました。
エラーが発生するため、catchブロックが実行されるはずですが、エラーハンドリングが行われず、処理が最後まで行ってしまいました。

原因

PowerShell で azcopy コマンドを実行する際、azcopy は外部プログラムとして扱われるため、PowerShell の標準的なエラーハンドリング機構である try...catch ブロックではエラーを捕捉できないことがあるらしいです。

解決策

下記のコードで意図的に例外を発生させることでエラーハンドリングを行うことができました。

try {
    $filePath = "C:\Users\user\Desktop\test.zip"
    $SASToken = "https://storageaccount.blob.core.windows.net/container/test.zip"
    azcopy copy $filePath $SASToken --recursive=true
    
    # $LASTEXITCODEを使用してエラーをスロー
    $exitCode = $LASTEXITCODE
    if ($exitCode -ne 0) {
      throw "AzCopy failed with exit code $exitCode"
    }
    
} catch {
    Write-Error "AZCopyのエラーが発生しました。"
    Write-Error $_.Exception.Message
}

LASTEXITCODEはPowerShellで実行した外部アプリの終了コードを取得するための変数です。この処理を追加することで、azcopyのエラーが発生した場合に$exitCodeには0以外の値が入り、例外を発生させることができます。

LASTEXITCODEの詳しい説明については下記のサイトを参考にしてください。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?