使用 PowerShell 管理 Azure Data Lake Storage Gen2 中的目錄和檔案

本文說明如何使用 PowerShell 在具有階層命名空間的儲存體帳戶中建立及管理目錄和檔案。

若要了解如何取得、設定及更新目錄和檔案的存取控制清單 (ACL),請參閱使用 PowerShell 管理 Azure Data Lake Storage Gen2 中的 ACL

參考 | Gen1 至 Gen2 對應 | 提供意見反應

必要條件

  • 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
    
  2. 若身分識別與多個訂用帳戶相關聯,請將使用中訂用帳戶設為您想要在其中建立和管理目錄的儲存體帳戶訂用帳戶。 在此範例中,使用訂用帳戶識別碼取代 <subscription-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-directory-2 的子目錄 (名為 my-subdirectory)。

$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 來取得使用者的名稱 (而不是物件識別碼)。

此範例會列出名為 my-directory 的目錄所含的內容。

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

下列範例會列出目錄中每個項目的 ACLPermissionsGroupOwner 屬性。 必須要有 -FetchProperty 參數才能取得 ACL 屬性的值。

$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 參數來移除檔案,而不需要提示。

Gen1 至 Gen2 對應

下表顯示用於 Data Lake Storage Gen1 的 Cmdlet 如何對應至 Data Lake Storage Gen2 的 Cmdlet。

注意

Azure Data Lake 儲存體 Gen1 現已淘汰。 請參閱這裡的淘汰公告。 Data Lake 儲存體 Gen1 資源無法再存取。 如果您需要特殊協助,請 與我們連絡。

Data Lake Storage Gen1 Cmdlet Data Lake Storage Gen2 Cmdlet 備註
Get-AzDataLakeStoreChildItem Get-AzDataLakeGen2ChildItem 根據預設,Get-AzDataLakeGen2ChildItem Cmdlet 只會列出第一個層級的子項目。 -Recurse 參數會以遞迴方式列出子項目。
Get-AzDataLakeStoreItem
Get-AzDataLakeStoreItemAclEntry
Get-AzDataLakeStoreItemOwner
Get-AzDataLakeStoreItemPermission
Get-AzDataLakeGen2Item Get-AzDataLakeGen2Item Cmdlet 的輸出項目具有下列屬性:ACL、擁有者、群組、權限。
Get-AzDataLakeStoreItemContent Get-AzDataLakeGen2FileContent Get-AzDataLakeGen2FileContent Cmdlet 會將檔案內容下載至本機檔案。
Move-AzDataLakeStoreItem Move-AzDataLakeGen2Item
New-AzDataLakeStoreItem New-AzDataLakeGen2Item 此 Cmdlet 會從本機檔案上傳新的檔案內容。
Remove-AzDataLakeStoreItem Remove-AzDataLakeGen2Item
Set-AzDataLakeStoreItemOwner
Set-AzDataLakeStoreItemPermission
Set-AzDataLakeStoreItemAcl
Update-AzDataLakeGen2Item Update-AzDataLakeGen2Item Cmdlet 只會更新單一項目,而不會以遞迴方式更新。 如果要以遞迴方式更新,請使用 Get-AzDataLakeStoreChildItem Cmdlet 列出項目,然後再透過管線將其傳送至 Update-AzDataLakeGen2Item Cmdlet。
Test-AzDataLakeStoreItem Get-AzDataLakeGen2Item 如果項目不存在,Get-AzDataLakeGen2Item Cmdlet 會回報錯誤。

另請參閱