Использовать Get-Content на основе типа данных - PullRequest
2 голосов
/ 24 марта 2020

У меня есть сценарий PowerShell, который вносит белый список IP-адресов в Azure Веб-приложения на основе IP-адресов в файле:

$ResourceGroupName = 'RG'
$WebAppName = 'WebApp'
$WhitelistFilePath = 'C:\IPs.txt'


$IPs = Get-Content $WhitelistFilePath
$name = 600
$priority = 600

foreach($IP in $IPs)
{
    Add-AzWebAppAccessRestrictionRule -ResourceGroupName $ResourceGroupName -WebAppName $WebAppName -Name "IP-$name" -Priority "$priority" -Action Allow -IpAddress "$IP/24"
    $name ++
    $priority ++
}

Этот сценарий отлично работает с простым списком IP-адресов. C: \ IPs.txt:

10.0.0.0
100.0.0.0

Получение:

Add-AzWebAppAccessRestrictionRule -ResourceGroupName RG -WebAppName WebApp -Name IP-600 -Priority 600 -Action Allow -IpAddress 10.0.0.0/24
Add-AzWebAppAccessRestrictionRule -ResourceGroupName RG -WebAppName WebApp -Name IP-601 -Priority 601 -Action Allow -IpAddress 100.0.0.0/24

Однако я также хотел бы добавить имена для этих IP-адресов, поэтому C: \ IPs .txt выглядит так:

Ben's IP
10.0.0.0
John's IP
100.0.0.0

Как мне отредактировать мой скрипт, чтобы я получил:

Add-AzWebAppAccessRestrictionRule -ResourceGroupName RG -WebAppName WebApp -Name "Ben's IP" -Priority 600 -Action Allow -IpAddress 10.0.0.0/24
Add-AzWebAppAccessRestrictionRule -ResourceGroupName RG -WebAppName WebApp -Name "John's IP" -Priority 601 -Action Allow -IpAddress 100.0.0.0/24

Вместо того, что я получаю сейчас:

Add-AzWebAppAccessRestrictionRule -ResourceGroupName RG -WebAppName WebApp -Name IP-600 -Priority 600 -Action Allow -IpAddress Ben's IP/24
Add-AzWebAppAccessRestrictionRule -ResourceGroupName RG -WebAppName WebApp -Name IP-601 -Priority 601 -Action Allow -IpAddress 10.0.0.0/24
Add-AzWebAppAccessRestrictionRule -ResourceGroupName RG -WebAppName WebApp -Name IP-602 -Priority 602 -Action Allow -IpAddress John's IP/24
Add-AzWebAppAccessRestrictionRule -ResourceGroupName RG -WebAppName WebApp -Name IP-603 -Priority 603 -Action Allow -IpAddress 100.0.0.0/24

Ответы [ 2 ]

3 голосов
/ 24 марта 2020

Бас ie полезный ответ показывает жизнеспособное решение с for l oop.

Возможно, более простой подход заключается в использовании Get-Content Параметр -ReadCount для чтения строк входного файла в пакетах , а именно в 2 раза в этом случае:

# Create a sample 'IPs.txt' file.
@'
Ben's IP
10.0.0.0
John's IP
100.0.0.0
'@ > IPs.txt

$priority = 600
Get-Content -ReadCount 2 IPs.txt | ForEach-Object {

  # Split the 2-element array of lines into its constituent lines.
  $name, $ip = $_

  # Call Add-AzWebAppAccessRestrictionRule with arguments
  # based on the variables.
  # -WhatIf previews the command; remove it to actually run the command.
  Add-AzWebAppAccessRestrictionRule -WhatIf `
    -ResourceGroupName RG -WebAppName WebApp `
    -Name $name -Priority ($priority++) -Action Allow -IpAddress $ip/24
}
2 голосов
/ 24 марта 2020

Вместо этого можно использовать for l oop:

for ($i = 0; $i -lt $IPs.Length; $i = $i + 2) {
    $name = $IPs[$i]
    $ip = $IPs[$i +1]
    Add-AzWebAppAccessRestrictionRule -ResourceGroupName $ResourceGroupName -WebAppName $WebAppName -Name "IP-$name" -Priority "$priority" -Action Allow -IpAddress "$ip/24"
    $priority++
}

Однако это может быть ненадежно в зависимости от того, насколько вы уверены в формате входного файла

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...