【问题标题】:Access key Value pairs of a blob json in powershell在powershell中访问blob json的键值对
【发布时间】:2021-04-06 05:56:16
【问题描述】:

我有一个 JSON,就像这样(只发布初始的 sn-p):

[
  {
    "ICloudBlob":      {
      "StreamWriteSizeInBytes":  4194304,
      "ServiceClient":  {
        "AuthenticationScheme":  1,
        "BufferManager":  null,
        "Credentials":      {
          "SASToken":  null,
          "AccountName":
          "storageaccountappse9a4d",
          "KeyName":  null,
          "IsAnonymous":  false,
          "IsSAS":  false,
          "IsSharedKey":  true,
          "IsToken":  false,
          "SASSignature":  null
        },
        "BaseUri":
        "https://storageaccountappse9a4d.blob.core.windows.net/",
        "StorageUri":  {
          "PrimaryUri":
          "https://storageaccountappse9a4d.blob.core.windows.net/",
          "SecondaryUri":  null
        },
        "DefaultRequestOptions":  {
          "RetryPolicy":  {

          },
          "EncryptionPolicy":  null,
          "RequireEncryption":  null,
          "CustomerProvidedKey":  null,
          "EncryptionScope":  null,
          "AbsorbConditionalErrorsOnRetry":  null,
          "LocationMode":  0,
          "ServerTimeout":  null,
          "MaximumExecutionTime":  null,
          "NetworkTimeout":  null,
          "ParallelOperationThreadCount":  1,
          "SingleBlobUploadThresholdInBytes":  134217728,
          "UseTransactionalMD5":  null,
          "StoreBlobContentMD5":  null,
          "DisableContentMD5Validation":  null,
          "ChecksumOptions":  {
            "DisableContentMD5Validation":  null,
            "StoreContentMD5":  null,
            "UseTransactionalMD5":  null,
            "DisableContentCRC64Validation":  null,
            "UseTransactionalCRC64":  null
          }

我想访问 ParallelOperationThreadCount 参数,为此我使用以下代码:

$JSON_obj=Get-AzStorageAccount | Get-AzStorageContainer | Get-AzStorageBlob | ConvertTo-JSON -Depth 
50
$ParallelOperationThreadCount=@()
foreach($i in $JSON_obj)
{
$ParallelOperationThreadCount+=$i.ICloudBlob.ServiceClient.DefaultRequestOptions.ParallelOperationThreadCount

 }
$ParallelOperationThreadCount

但是,在运行此程序时,没有输出。它运行然后退出。 有什么方法可以找出可行的方法吗?

【问题讨论】:

  • 你是如何运行它的?
  • 使用VSCode。并在问题中提到了代码sn-p。
  • 如果您使用ConvertTo-JSON,您会将您的object 转换为(JSON)string。如果您想将 (JSON) string 转换为 object,您应该使用:ConvertFrom-Json
  • 我也不会调用你的变量$JSON_obj,因为这很令人困惑,它只是一个对象,不再与 Json 有关系(在你执行 ConvertFrom-Json 之后)。意思是,你不能遍历一个 Json 字符串,你正在遍历一个对象......

标签: powershell azure-blob-storage azure-powershell


【解决方案1】:

cmdlet ConvertTo-JSON 会将您的结果转换为 json 字符串。它不会将结果作为数组返回。

所以我建议你删除第一行命令中的 cmdlet ConvertTo-JSON。之后,该命令将结果作为对象数组返回。然后您的脚本将返回正确的结果。

例如(我在一个存储帐户中这样做)

Connect-AzAccount

$accountName =""
$groupName=""

$JSON_obj=(Get-AzStorageAccount -ResourceGroupName $groupName -Name $accountName  | Get-AzStorageContainer  | Get-AzStorageBlob )

$ParallelOperationThreadCount=@()
foreach($i in $JSON_obj)
{
$ParallelOperationThreadCount+=$i.ICloudBlob.ServiceClient.DefaultRequestOptions.ParallelOperationThreadCount

 }
$ParallelOperationThreadCount

此外,我们还可以将脚本简化如下。

$ParallelOperationThreadCount= (Get-AzStorageAccount -ResourceGroupName $groupName -Name $accountName  |
        Get-AzStorageContainer  | Get-AzStorageBlob|
        Select-Object -Property @{Name="ParallelOperationThreadCount";Expression={$_.ICloudBlob.ServiceClient.DefaultRequestOptions.ParallelOperationThreadCount}})

$ParallelOperationThreadCount


更新

请参考以下脚本

Connect-AzAccount

$accountName =""
$groupName=""

$JSON_obj=(Get-AzStorageAccount -ResourceGroupName $groupName -Name $accountName  | Get-AzStorageContainer  | Get-AzStorageBlob )

$ParallelOperationThreadCount=@()
foreach($i in $JSON_obj)
{
$ParallelOperationThreadCount+=$i.ICloudBlob.ServiceClient.DefaultRequestOptions.ParallelOperationThreadCount

 }
$ParallelOperationThreadCount

$JSON_obj|ConvertTo-JSON -Depth 50 | % { [System.Text.RegularExpressions.Regex]::Unescape($_) } | Out-File -Encoding Ascii - append C:\Users\rakshitas\Documents\json_excel\blob.json 

【讨论】:

  • 所以这行得通,谢谢。我也想将 json 存储在一个文件中,因此需要进行一些更改,因此使用以下命令:$JSON=Get-AzStorageAccount |获取 AzStorageContainer |获取 AzStorageBlob |转换为 JSON -深度 50 | % { [System.Text.RegularExpressions.Regex]::Unescape($_) } |输出文件 - 编码 Ascii - 附加 C:\Users\rakshitas\Documents\json_excel\blob.json $JSON_obj = ConvertFrom-Json -InputObject $JS​​ON。那么它不起作用,有什么建议吗?
  • 这有帮助。我想访问另一个键值对,它有一个 \u0027 unicode。我提到的脚本以这种方式返回 json。但是,当我像现在这样访问字段时,不会返回任何输出。认为这可能是因为这里的代码:-Depth 50 | % { [System.Text.RegularExpressions.Regex]::Unescape($_) } ?
  • @Rakshita 请尝试使用$JSON_obj|ConvertTo-JSON|Out-File。
  • 是的,这就是我在 outfile 中得到的。很少有带有 unicode 的条目。正则表达式代码,删除它们。但后来我无法访问键值对。你认为可能是因为这些特定的代码行?
猜你喜欢
  • 1970-01-01
  • 2021-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-15
  • 2020-09-07
  • 1970-01-01
  • 2020-11-10
相关资源
最近更新 更多