使用 PowerShell 脚本从 Azure Blob 存储读取 JSON 文件并写回 Blob 存储中的另一个文件
Posted
技术标签:
【中文标题】使用 PowerShell 脚本从 Azure Blob 存储读取 JSON 文件并写回 Blob 存储中的另一个文件【英文标题】:Read JSON file from Azure Blob Storage using PowerShell script and write back to another file in blob storage 【发布时间】:2021-06-11 00:40:06 【问题描述】:我在 Azure Blob 存储中存储了以下 JSON 文件 (product.json)。是否可以编写 PowerShell 脚本从 blob 存储中读取此文件进行一些更改并写回另一个文件。 我想要的输出文件应该发生以下更改:
-
将所有“_id”替换为“id”
删除所有“_rev”及其值。
Product.json
[
"_id": "9f4da9d6babeb9d411c896baa68c94c8",
"_rev": "1-4259271795225df18768ab68baacc96c",
"account_id": 692278,
"limit": 10000,
"products": [
"Commodity",
"InvestmentStock"
]
,
"_id": "cc4b59f585b8556a2bedca78294a0797",
"_rev": "1-410e479257faba0457bd9b4816c4dc95",
"account_id": 328304,
"limit": 10000,
"products": [
"Derivatives",
"InvestmentStock",
"CurrencyService"
]
,
"_id": "d7e2a72963cff2760514ff772969ffe0",
"_rev": "1-2ec6e2679eae13b76410c93f49c14c4a",
"account_id": 674364,
"limit": 10000,
"products": [
"InvestmentStock"
]
]
outputfile.json应该如下:
[
"id": "9f4da9d6babeb9d411c896baa68c94c8",
"account_id": 692278,
"limit": 10000,
"products": [
"Commodity",
"InvestmentStock"
]
,
"id": "cc4b59f585b8556a2bedca78294a0797",
"account_id": 328304,
"limit": 10000,
"products": [
"Derivatives",
"InvestmentStock",
"CurrencyService"
]
,
"id": "d7e2a72963cff2760514ff772969ffe0",
"account_id": 674364,
"limit": 10000,
"products": [
"InvestmentStock"
]
]
【问题讨论】:
请编辑您的问题并包括您迄今为止尝试过的内容(您编写的 PS 脚本)以及您遇到的问题。 谢谢高拉夫。请编辑版本。 您使用的 SDK 版本。这也是 C# 代码。你提到了 PowerShell。 SDK 3.0。我正在尝试 C#。但如果可能的话,要问的是 PowerShell。不知道使用 PowerShell 是否可行 我删除了我尝试过的 C# 代码。如果可能的话,让我们不要混淆其他人是否使用 PowerShell 【参考方案1】:不是最优雅的方式,但这应该可以解决问题:
$accountName = "account-name"
$accountKey = "account-key"
$containerName = "container-name"
$blobName = "Product.json"
$outputBlobName = "Output.json"
$ctx = New-AzStorageContext -StorageAccountName $accountName -StorageAccountKey $accountKey
#Read blob and save it to local file
Get-AzStorageBlobContent -Blob $blobName -Container $containerName -Destination "Product.json" -Context $ctx
#Read local file and get JSON object
$jsonContent = Get-Content -Raw -Path "Product.json" | ConvertFrom-Json
#Loop through json content and manipulate it
For ($i=0; $i -lt $jsonContent.Length; $i++)
$jsonContent[$i] | Add-Member -NotePropertyName "id" -NotePropertyValue $jsonContent[$i]._id
$jsonContent[$i].PsObject.Properties.Remove("_id")
$jsonContent[$i].PsObject.Properties.Remove("_rev")
$jsonContent
#Write content back to local disk
$jsonContent | ConvertTo-Json | Set-Content -Path $outputBlobName
#Upload into Azure Storage
$properties = @"ContentType" = "application/json"
Set-AzStorageBlobContent -File $outputBlobName -Container $containerName -Blob $outputBlobName -Properties $properties -Context $ctx
【讨论】:
谢谢高拉夫。不确定是否可以将文件存储在内存中而不是本地磁盘中【参考方案2】:如果要将文件存储在内存中,可以使用DownloadText()
方法将内容下载到内存中。
示例代码:
$accountName = "xxx"
$accountKey = "xxx"
$containerName = "xxx"
$blobName = "Product.json"
$outputBlobName = "Output.json"
$context = New-AzStorageContext -StorageAccountName $accountName -StorageAccountKey $accountKey
$container_client = Get-AzStorageContainer -Name $containerName -Context $context
$source_blob_client = $container_client.CloudBlobContainer.GetBlockBlobReference($blobName)
#download the blob as text into memory
$download_file = $source_blob_client.DownloadText()
$jsonContent = $download_file | ConvertFrom-Json
#Loop through json content and manipulate it
For ($i=0; $i -lt $jsonContent.Length; $i++)
$jsonContent[$i] | Add-Member -NotePropertyName "id" -NotePropertyValue $jsonContent[$i]._id
$jsonContent[$i].PsObject.Properties.Remove("_id")
$jsonContent[$i].PsObject.Properties.Remove("_rev")
$replaced_json = $jsonContent | ConvertTo-Json
#upload the json file
$dest_blob_client = $container_client.CloudBlobContainer.GetBlockBlobReference($outputBlobName)
$dest_blob_client.Properties.ContentType = "application/json"
$dest_blob_client.UploadText($replaced_json)
Write-Output("**completed**")
【讨论】:
以上是关于使用 PowerShell 脚本从 Azure Blob 存储读取 JSON 文件并写回 Blob 存储中的另一个文件的主要内容,如果未能解决你的问题,请参考以下文章
使用 PowerShell 脚本从 Azure Blob 存储读取 JSON 文件并写回 Blob 存储中的另一个文件
从 Powershell 获取 Azure Active Directory 访问令牌
是否有任何 PowerShell 脚本或命令可以从 Azure 门户获取租户中所有用户访问角色的报告?
在 Azure Devops 中使用从一个 PowerShell 任务到另一个任务的变量值