PowerShell 操作 Azure Blob Storage
本文假设已经存在了一个 Azure Storage Account,需要进行文件的上传,下载,复制,删除等操作。
为了方便查看 PowerShell 代码执行的结果,本文使用了 MS 发布的一个 Azure Storage 客户端工具:Microsoft Azure Storage Explorer,文中简称为 Storage Explorer。
安装 PowerShell Azure 模块
操作 Azure 的模块是不随 PowerShell 一起安装的,使用前需要单独的安装。
PowerShellGet 模块
如果要从 PowerShell Gallery 安装 Azure 模块,需要确保已经安装了 PowerShellGet 模块。下面的命令检查已安装 PowerShellGet 模块的版本:
Get-Module PowerShellGet -list | Select-Object Name,Version,Path

安装 Azure PowerShell 模块
下面的命令安装 Azure Resource Manager 模块:
Install-Module AzureRM -AllowClobber
注意,安装过程中有确认安装的交互过程。
载入 Azure 模块
在使用 Azure 相关的命令前需要通过 Import-Module 命令加载 Azure 模块:
Import-Module AzureRM
创建 Azure Storage 上下文
如果我们要对一个 Storage Account 中的文件进行操作,需要提供访问 Storage Account 的认证信息。我们的方式是直接通过 New-AzureStorageContext 命令创建一个 AzureStorageContext 类型的对象,这个对象中包含了认证信息,所以接下来所有对 storage 的访问操作都需要使用它:
$ctx = New-AzureStorageContext -ConnectionString "DefaultEndpointsProtocol=https;AccountName=youraccountname;AccountKey=youraccesskey;"
除了使用 -ConnectionString 选项,还可以把参数分开来写:
$StorageAccountName = "youraccountname"
$StorageAccountKey = "youraccesskey"
$ctx = New-AzureStorageContext -StorageAccountName $StorageAccountName -StorageAccountKey $StorageAccountKey -Protocol Https
注意,在上面的命令中除了添加必要的认证选项外,我们还显式的指定了通信协议。指定 https 是非常重要的,因为以 https 协议上传下载的数据默认会进行数据的完整性校验。也就是说在进行文件的上传或者下载时,我们不需要再做额外的数据完整性校验了。
除了 New-AzureStorageContext 命令,还有其他的方式可以获得 AzureStorageContext 对象。比如可以先通过 Login-AzureRmAccount 登录,然后找到某个(或者是创建一个) Storage Account,并获取其 Context 属性。
创建 Container
任何的 blob 对象都必须被包含在一个 Container 中,所以在进行 blob 文件的操作前,我们需要先创建一个 Container:
$ContainerName = "containertest"
New-AzureStorageContainer -Name $ContainerName -Permission Off -Context $ctx
为 Container 设置的权限会控制 Container 中的所有文件,当前一共有三个权限类型:
Container:匿名用户可以访问文件内容,并且可以枚举 Container 中的所有文件。
Blob:匿名用户可以访问文件内容,但是不能枚举 container 中的文件。
Off:匿名用户不能访问文件。
-Permission 选项用来设置 Container 的权限,默认值是 Off(笔者喜欢总是显式的指定这个选项以提高脚本的可读性)。
-Context 选项指定该命令的执行上下文,主要是认证信息,这里我们使用前面生成的对象 $ctx。
上传文件
我们可以通过 Set-AzureStorageBlobContent 命令来上传文件,需要指定文件存放的 Container 和 访问 Storage Account 的上下文:
Set-AzureStorageBlobContent -Container $ContainerName -File ".\cortana.jpg" -Blob "cortana.jpg" -Context $ctx
上传成功后我们可以通过 Storage Explorer 直观的检查一下:

这样上传的文件都是直接放在 Container 的根目录下的,如果要对文件存放的目录进行管理,需要在上传时指定包含目录名称的文件名:
Set-AzureStorageBlobContent -Container $ContainerName -File ".\cortana.jpg" -Blob "images/cortana.jpg" -Context $ctx
这样上传后,文件 cortana.jpg 会存放在 images 目录下。
上传目录下的多个文件
我们还可以通过一个命令一次上传某个目录下的所有文件:
Get-ChildItem -Path "D:\ConsoleApplication1" -File -Recurse | Set-AzureStorageBlobContent -Container $ContainerName -Context $ctx
D:\ConsoleApplication1 目录中是一个简单的 C# 控制台应用,通过管道组合 Get-ChildItem 命令,可以完成多个文件的上传,并且这些文件的目录结构和原来都是一样的。
覆盖已经存在的 blob
如果我们要上传一个文件,并指定了一个已经存在的 blob 名称,此时会与用户交互以确定是否覆盖已经存在的 blob。对于各种自动化的任务,我们不希望交互的行为,所以可以加上 -Force 选项强制覆盖已有文件:
Set-AzureStorageBlobContent -Container $ContainerName -File ".\cortana.jpg" -Blob "cortana.jpg" -Context $ctx -Force
下载文件
Get-AzureStorageBlobContent 命令用来下载文件。下载文件的前提是你知道某个 blob 对象的名称:
$localFileDirectory = "D:\"
Get-AzureStorageBlobContent -Destination $localFileDirectory -Container $ContainerName -Blob "images/cortana.jpg" -Context $ctx -Force
注意,下载到本地的文件路径为:"D:\images\cortana.jpg"。
其实在很多的情况下我们都没有这么明确的 blob 名称,我们需要下载满足某些情况的 blob,比如下载 images 目录下的所有文件。这里的问题是我们不知道 images 究竟是哪级目录,所以可能的做法是遍历 Container 下的所有文件,然后检查文件名称中包含 images 目录的文件并下载它。为了遍历 Container 中的文件,需要使用 Get-AzureStorageBlob 命令:
$localFileDirectory = "D:\"
$blobs = Get-AzureStorageBlob -Container $ContainerName -Context $ctx
foreach($blob in $blobs)
{
if($blob.Name.Contains("images/"))
{
Get-AzureStorageBlobContent -Destination $localFileDirectory -Container $ContainerName -Blob $blob.Name -Context $ctx -Force
}
}
这段代码中我们用 Get-AzureStorageBlob 命令拿到 Container 下的所有文件信息,然后检查文件的路径中有没有包含 "images/" 字符串,如果包含,就下载这个文件。
复制文件
自动化的脚本操作可以轻松愉快的备份各种数据,当然也包含存储在 Storage Account 中的文件。Start-AzureStorageBlobCopy 命令用于 blob 文件的复制操作。单从名字上看这应该是个异步方法,但是真实的情况稍微复杂一些。因为这个命令既可以用于同步操作也可以用于异步操作,关键在于调用这个命令的方式!下面的命令在同一个 Container 中执行文件复制操作:
Start-AzureStorageBlobCopy -SrcBlob "cortana.jpg" `
-SrcContainer $ContainerName `
-DestContainer $ContainerName `
-DestBlob "myimages/cortana.jpg" `
-Context $ctx
这个操作是同步执行的,它把 Container 根目录下的 cortana.jpg 文件拷贝到同一个 Container 的 myimages 目录下。
如果你要跨地域的在不同的 Storage Account 中复制大量的文件,建议你通过异步的方式进行:
# 把 Start-AzureStorageBlobCopy 命令的返回值存储到变量中会让复制过程以异步的方式进行。
$blobResult = Start-AzureStorageBlobCopy -SrcBlob $blobName `
-SrcContainer $containerName `
-DestContainer $containerName2 `
-DestBlob $blobName `
-Context $ctx `
-DestContext $ctx2
# 然后通过检查返回值的方式确定复制操作是否完成。
$status = $blobResult | Get-AzureStorageBlobCopyState
# 通过循环,当检查到结果的状态不为 "Pending" 时,表示复制操作已经完成。
while ($status.Status -eq "Pending") {
$status = $blobResult | Get-AzureStorageBlobCopyState
$status
Start-Sleep 10
}
删除文件
Remove-AzureStorageBlob 命令删除指定的 blob 文件:
Remove-AzureStorageBlob -Container $ContainerName -Blob "myimages/cortana.jpg" -Context $ctx
要是有复杂点的要求,就得通过遍历 Contaner 中的文件来完成。
权限管理
在创建 Container 时我们已经提到,可以给 Container 设置三种不同的访问控制权限:Container,Blob,Off。我们也可以在创建 Container 之后通过 Set-AzureStorageContainerAcl 命令改变它的访问控制权限。下面的命令把 Container 的访问控制权限设置为 Blob:
Set-AzureStorageContainerAcl -Name $containerName -Context $ctx -Permission Blob
PowerShell 操作 Azure Blob Storage的更多相关文章
- Python 操作 Azure Blob Storage
笔者在<Azure 基础:Blob Storage>一文中介绍了 Azure Blob Storage 的基本概念,并通过 C# 代码展示了如何进行基本的操作.最近笔者需要在 Linux ...
- PowerShell 操作 Azure SQL Active Geo-Replication 实战
<Azure SQL Database Active Geo-Replication简介>一文中,我们比较全面的介绍了 Azure SQL Database Active Geo-Repl ...
- Azure Blob Storage 基本用法 -- Azure Storage 之 Blob
Azure Storage 是微软 Azure 云提供的云端存储解决方案,当前支持的存储类型有 Blob.Queue.File 和 Table. 笔者在<Azure Table storage ...
- Azure Blob Storage从入门到精通
今天推荐的是一个系列文章,让读者阅读完成后可以对Azure Blob Storage的开发有一个全面的了解,可谓是从入门到精通. Azure在最初的版本里面就提供了非结构化数据的存储服务,也即Blob ...
- [AWS vs Azure] 云计算里AWS和Azure的探究(6) - Amazon Simple Storage Service 和 Microsoft Azure Blob Storage
这几天Nasuni公司出了一份报告,分析了各个云厂商的云存储的性能,包括Amazon S3,Azure Blob Storage, Google Drive, HP以及Rackspace.其中性能上A ...
- presto访问 Azure blob storage
当集群使用Azure Blog Storage时,prestoDB无法获取返回结果,在此记录下 如下,hive里面的两个表,一个使用的是本地的hdfs,一个是使用 azure blob storage ...
- DW(六):polybase访问Azure Blob Storage
目录: 连接hadoop配置语法 配置hadoop连接 Pushdown配置 Create external tables for Azure blob storage 连接hadoop配置语法: g ...
- hadoop(四): 本地 hbase 集群配置 Azure Blob Storage
基于 HDP2.4安装(五):集群及组件安装 创建的hadoop集群,修改默认配置,将hbase 存储配置为 Azure Blob Storage 目录: 简述 配置 验证 FAQ 简述: hadoo ...
- [Windows Azure] How to use the Windows Azure Blob Storage Service in .NET
How to use the Windows Azure Blob Storage Service in .NET version 1.7 version 2.0 This guide will de ...
随机推荐
- cocos2dx - 环境配置,项目创建
准备工具 cocos2dx当前最新版本:v3.9 官网下载地址: http://www.cocos.com/download/ python 2.7x最新版本:2.7.11 官 ...
- NDK Jni 开发(1)
1. 学习地址 http://my.oschina.net/lifj/blog/177087 http://www.cnblogs.com/devinzhang/archive/2012/02/29/ ...
- 二:Linux 的基本命令、VI编辑器、Linux中软件安装
Linux 的基本命令 1. 文件操作 a) Windows 是多根的文件系统,物理上是 1 到多块硬盘,逻辑上分为 C.D.E--盘, 每个盘都是一棵树.Linux 是单根的文件系统,不分 CDE ...
- codeforces 258D
D. Little Elephant and Broken Sorting time limit per test 2 seconds memory limit per test 256 megaby ...
- DOS常用命令及进制转换
DOS是一种用户单任务磁盘操作系统.在DOS中,我们可以通过DOS命令来管理设备和文件,如打印文件.删除文件,复制文件,创建新的文件夹和文档并编写内容等功能同时也是JAVA编程基础的一个入门.进入DO ...
- UVa 10954,Add All
Huffman编码简化版,优先队列搞定. 1A 调试的时候发现一个问题..木有想明白...问题代码里给出,哪位大神给解释下. #include <iostream> #include &l ...
- Centos 7.3 编译 & 安装 & 测试 facebook faiss
许多 AI 系统训练完毕,正式上线时的基本操作往往可以抽象为:在高维向量空间中,给定一个向量,寻找与之最相近的 k 个向量.当向量数目异常巨大时,如何快速地执行这一基本操作,便成为 AI 系统在工程应 ...
- 【转】IO流程
原文地址:http://blog.chinaunix.net/uid-26922071-id-3954900.html IO之流程与buffer概览 为了说明这个流程,还是用图来描述一下比较直观. ...
- Cocos 2d-X Lua 游戏添加苹果内购(二) OC和Lua交互代码详解
这是第二篇 Cocos 2d-X Lua 游戏添加苹果内购(一) 图文详解准备流程 这是前面的第一篇,详细的说明了怎样添加内购项目以及填写银行信息提交以及沙盒测试员的添加使用以及需要我们注意的东西,结 ...
- CentOS(linux发行版)系统安装中文输入法:
安装步骤: 1>.打开终端界面,使用su - root切换到超级用户,然后输入yum install"@Chinese support",回车. 2>.中间安装过程提示 ...