Azure PowerShell - как вытащить - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть сценарий PowerShell для Azure, который извлекает файл XML и затем запускает значения в цикле 'foreach'.

В хранилище Azure есть файл BLOB со следующим форматом (XML) -

<?xml version="1.0"?>
 <Root>
<PublicSubnets>
<Subnet>192.168.1.0/24</Subnet>
<Subnet>192.168.50.0/24</Subnet>
<Subnet>10.82.19.5/24</Subnet>
<Subnet>10.1.1.0/16</Subnet>
<Subnet>172.16.15.0/16</Subnet>
 </PublicSubnets>
<Descrip>
<Description>"This is the description"</Description>
</Descrip>
</Root>

Идея заключается в том, чтобы сценарий Azure PowerShell проходил по XML и создавал запись группы безопасности сети для каждого из них. Эта часть отлично работает.

Я пытаюсь вместо того, чтобы проглотить XML-файл, я хочу, чтобы это был Json со всеми значениями подсети.

Вот текущий сценарий (обратите внимание, что $ nsgname и $ resourcegroupname вводятся пользователем для группы безопасности сети, в которой сценарий затем создает записи NSG для каждой подсети в файле XML)

$Url = "https://theteststorage.blob.core.windows.net/params/SubnetParams.xml?st=2018-10-25T19andrestoftheURL"
$Subnets = @()
[xml]$xml = Invoke-WebRequest $Url -UseBasicParsing | Select-Object -Expand Content

$counter=0
foreach ($subnet in $xml.Root.PublicSubnets.Subnet) 
{
$counter++
Write-Output "Counter is at $counter and subnet is $subnet"
}

Это должно распечатать: Счетчик на 1, а подсеть 192.168.1.0/24 Счетчик на 2 и подсеть 192.168.50.0/24

Как бы я поступил так, но вместо XML это был бы Json

1 Ответ

0 голосов
/ 06 ноября 2018

Что вам нужно сделать, это загрузить содержимое файла json в виде строки, а затем преобразовать его в объект Powershell, используя ConvertFrom-Json.

Пожалуйста, следуйте приведенному ниже коду:

$url="https://xxx.blob.core.windows.net/t1s/test.json"
$subnets=@()
$web_client = New-Object System.Net.WebClient
$download_json = $web_client.DownloadString($url)

#convert the download string to a PowerShell object
$json = $download_json | ConvertFrom-Json

$counter=0
foreach($subnet in $json.Root.PublicSubnets.Subnet)
{
$counter++
Write-Output "Counter is at $counter and subnet is $subnet"
}

файл test.json:

{
  "Root": {
    "PublicSubnets": {
      "Subnet": [
        "192.168.1.0/24",
        "192.168.50.0/24",
        "10.82.19.5/24",
        "10.1.1.0/16",
        "172.16.15.0/16"
      ]
    },
    "Descrip": { "Description": "\"This is the description\"" }
  }
}

Результат теста: enter image description here

Обновление

Или вы можете использовать Invoke-RestMethod -Uri $url, который автоматически проанализирует ответ json на PSObject:

enter image description here

...