使用 PowerShell 管理 Azure Data Lake Storage Gen2 中的目录和文件

本文介绍了如何使用 PowerShell 在具有分层命名空间的存储帐户中创建和管理目录与文件。

若要了解如何获取、设置和更新目录与文件的访问控制列表 (ACL),请参阅使用 PowerShell 管理 Azure Data Lake Storage Gen2 中的 ACL

引用 | 提供反馈 |

先决条件

  • Azure 订阅。 有关详细信息,请参阅获取 Azure 试用版

  • 一个已启用分层命名空间的存储帐户。 按这些说明创建一个。

  • 已安装 .NET Framework 4.7.2 或更高版本。 有关详细信息,请参阅下载 .NET Framework

  • PowerShell 5.1 或更高版本。

安装 PowerShell 模块

  1. 使用以下命令验证安装的 PowerShell 版本是否为 5.1 或以上。

    echo $PSVersionTable.PSVersion.ToString()
    

    若要升级 PowerShell 版本,请参阅升级现有的 Windows PowerShell

  2. 安装 Az.Storage 模块。

    Install-Module Az.Storage -Repository PSGallery -Force  
    

    有关如何安装 PowerShell 模块的详细信息,请参阅安装 Azure PowerShell 模块

连接到帐户

选择希望命令如何获取存储帐户的授权。

选项 1:使用 Microsoft Entra ID 获取授权

如果使用此方法,系统可确保用户帐户具有适当的 Azure 基于角色的访问控制 (Azure RBAC) 分配和 ACL 权限。

  1. 打开 Windows PowerShell 命令窗口,使用 Connect-AzAccount 命令登录到 Azure 订阅,然后按照屏幕上的指示进行操作。

    Connect-AzAccount -Environment AzureChinaCloud
    
  2. 如果你的标识已关联到多个订阅,请将活动订阅设置为要在其中创建和管理目录的存储帐户的订阅。 在此示例中,请将 <subscription-id> 占位符值替换为你的订阅 ID。

    Select-AzSubscription -SubscriptionId <subscription-id>
    
  3. 获取存储帐户上下文。

    $ctx = New-AzStorageContext -StorageAccountName '<storage-account-name>' -UseConnectedAccount
    

选项 2:使用存储帐户密钥获取授权

如果使用此方法,系统不会检查 Azure RBAC 或 ACL 权限。 使用帐户密钥获取存储帐户上下文。

$ctx = New-AzStorageContext -StorageAccountName '<storage-account-name>' -StorageAccountKey '<storage-account-key>'

创建容器

容器充当文件的文件系统。 可以使用 New-AzStorageContainer cmdlet 创建一个文件系统。

此示例创建一个名为 my-file-system 的容器。

$filesystemName = "my-file-system"
New-AzStorageContainer -Context $ctx -Name $filesystemName

创建目录

使用 New-AzDataLakeGen2Item cmdlet 创建目录引用。

此示例将名为 my-directory 的目录添加到容器中。

$filesystemName = "my-file-system"
$dirname = "my-directory/"
New-AzDataLakeGen2Item -Context $ctx -FileSystem $filesystemName -Path $dirname -Directory

此示例添加相同的目录,但同时还会设置权限、umask、属性值和元数据值。

$dir = New-AzDataLakeGen2Item -Context $ctx -FileSystem $filesystemName -Path $dirname -Directory -Permission rwxrwxrwx -Umask ---rwx---  -Property @{"ContentEncoding" = "UDF8"; "CacheControl" = "READ"} -Metadata  @{"tag1" = "value1"; "tag2" = "value2" }

显示目录属性

此示例使用 Get-AzDataLakeGen2Item cmdlet 获取目录,然后将属性值输出到控制台。

$filesystemName = "my-file-system"
$dirname = "my-directory/"
$dir =  Get-AzDataLakeGen2Item -Context $ctx -FileSystem $filesystemName -Path $dirname
$dir.ACL
$dir.Permissions
$dir.Group
$dir.Owner
$dir.Properties
$dir.Properties.Metadata

注意

若要获取容器的根目录,请省略 -Path 参数。

重命名或移动目录

使用 Move-AzDataLakeGen2Item cmdlet 重命名或移动目录。

此示例将目录的名称 my-directory 重命名为 my-new-directory

$filesystemName = "my-file-system"
$dirname = "my-directory/"
$dirname2 = "my-new-directory/"
Move-AzDataLakeGen2Item -Context $ctx -FileSystem $filesystemName -Path $dirname -DestFileSystem $filesystemName -DestPath $dirname2

注意

如果要直接覆盖而不触发系统提示,请使用 -Force 参数。

此示例将名为 my-directory 的目录移到名为 my-subdirectorymy-directory-2 子目录。

$filesystemName = "my-file-system"
$dirname = "my-directory/"
$dirname2 = "my-directory-2/my-subdirectory/"
Move-AzDataLakeGen2Item -Context $ctx -FileSystem $filesystemName -Path $dirname -DestFileSystem $filesystemName -DestPath $dirname2

删除目录

使用 Remove-AzDataLakeGen2Item cmdlet 删除目录。

此示例删除名为 my-directory 的目录。

$filesystemName = "my-file-system"
$dirname = "my-directory/"
Remove-AzDataLakeGen2Item  -Context $ctx -FileSystem $filesystemName -Path $dirname

可以使用 -Force 参数删除文件,而不会看到提示。

从目录下载

使用 Get-AzDataLakeGen2ItemContent cmdlet 从目录中下载文件。

此示例从名为 my-directory 的目录中下载名为 upload.txt 的文件。

$filesystemName = "my-file-system"
$filePath = "my-directory/upload.txt"
$downloadFilePath = "download.txt"
Get-AzDataLakeGen2ItemContent -Context $ctx -FileSystem $filesystemName -Path $filePath -Destination $downloadFilePath

列出目录内容

使用 Get-AzDataLakeGen2ChildItem cmdlet 列出目录的内容。 可以使用可选参数 -OutputUserPrincipalName 来获取用户的名称(而不是对象 ID)。

此示例列出名为 my-directory 的目录的内容。

$filesystemName = "my-file-system"
$dirname = "my-directory/"
Get-AzDataLakeGen2ChildItem -Context $ctx -FileSystem $filesystemName -Path $dirname -OutputUserPrincipalName

下面的示例列出目录中每个项的 ACLPermissionsGroupOwner 属性。 获取 ACL 属性的值需要 -FetchProperty 参数。

$filesystemName = "my-file-system"
$dirname = "my-directory/"
$properties = Get-AzDataLakeGen2ChildItem -Context $ctx -FileSystem $filesystemName -Path $dirname -Recurse -FetchProperty
$properties.ACL
$properties.Permissions
$properties.Group
$properties.Owner

注意

若要列出容器的根目录的内容,请省略 -Path 参数。

将文件上传到目录

使用 New-AzDataLakeGen2Item cmdlet 将文件上传到目录。

此示例将名为 upload.txt 的文件上传到名为 my-directory 的目录。

$localSrcFile =  "upload.txt"
$filesystemName = "my-file-system"
$dirname = "my-directory/"
$destPath = $dirname + (Get-Item $localSrcFile).Name
New-AzDataLakeGen2Item -Context $ctx -FileSystem $filesystemName -Path $destPath -Source $localSrcFile -Force

此示例上传同一文件,但随后会设置目标文件的权限、umask、属性值和元数据值。 此示例还会将这些值输出到控制台。

$file = New-AzDataLakeGen2Item -Context $ctx -FileSystem $filesystemName -Path $destPath -Source $localSrcFile -Permission rwxrwxrwx -Umask ---rwx--- -Property @{"ContentEncoding" = "UDF8"; "CacheControl" = "READ"} -Metadata  @{"tag1" = "value1"; "tag2" = "value2" }
$file1
$file1.Properties
$file1.Properties.Metadata

注意

若要将文件上传到容器的根目录,请省略 -Path 参数。

显示文件属性

此示例使用 Get-AzDataLakeGen2Item cmdlet 获取文件,然后将属性值输出到控制台。

$filepath =  "my-directory/upload.txt"
$filesystemName = "my-file-system"
$file = Get-AzDataLakeGen2Item -Context $ctx -FileSystem $filesystemName -Path $filepath
$file
$file.ACL
$file.Permissions
$file.Group
$file.Owner
$file.Properties
$file.Properties.Metadata

删除文件

使用 Remove-AzDataLakeGen2Item cmdlet 删除文件。

此示例删除名为 upload.txt 的文件。

$filesystemName = "my-file-system"
$filepath = "upload.txt"
Remove-AzDataLakeGen2Item  -Context $ctx -FileSystem $filesystemName -Path $filepath

可以使用 -Force 参数删除文件,而不会看到提示。

另请参阅