如何用PowerShell调用Azcopy上传文件到Azure Blob成功后删除本地文件
解决方案
你当前脚本的核心问题是仅做了批量上传操作,没有捕获单个文件的上传结果,也没有对应触发删除逻辑,所以每次循环都会重复上传所有本地存在的iso文件。可以通过逐文件校验上传状态的逻辑实现需求,无需依赖Azcopy的sync功能,也不会受Blob端文件被移走的影响。
完整可用脚本
# 先定义本地上传目录和Blob SAS地址 $Upload = "你的本地上传目录路径" $blobSasUrl = "你的Azure Blob容器SAS URL" while($true){ # 遍历本地所有iso文件 $localIsoFiles = Get-ChildItem -Path $Upload -Filter "*.iso" -File foreach ($file in $localIsoFiles) { # 单个文件执行Azcopy上传,overwrite=false避免重复上传同名未被移走的Blob .\azcopy copy $file.FullName $blobSasUrl --log-level ERROR --overwrite=false # 校验Azcopy执行结果,退出码为0代表上传成功 if ($LASTEXITCODE -eq 0) { # 上传成功后删除本地源文件 Remove-Item $file.FullName -Force Write-Host "文件 $($file.Name) 上传成功,已删除本地文件" } else { Write-Host "文件 $($file.Name) 上传失败,下次循环重试" } } Start-Sleep -Seconds 60 -Verbose }
参数说明
--overwrite=false:如果对应Blob还未被移走,不会重复覆盖上传相同文件名的文件,节省带宽$LASTEXITCODE:Azcopy执行后的系统退出码,0代表操作完全成功,非0代表出现错误- 逐文件处理的逻辑完全不依赖Blob端的文件存在状态,符合你Blob作为暂存区、文件会被后续移走的使用场景
注意事项
- 提前确保Azcopy程序存放在脚本执行目录,或已加入系统环境变量可直接调用
- 使用的SAS URL需要拥有对应Blob容器的写入权限
- 若存在超大体积的iso文件,可根据实际需求调整循环间隔,或添加Azcopy可选参数适配业务场景
内容的提问来源于stack exchange,提问作者Michael Moore
相关产品推荐
相关产品推荐

