Во время работы конвейера Azure DevOps, если мы не даем никакого значения переменной, которая используется в сценарии PowerShell конвейера - PullRequest
0 голосов
/ 09 мая 2020

У меня есть сценарий PowerShell, в котором используется переменная "ResourceGroup". Нам нужно присвоить значение группе ресурсов во время работы конвейера. Если мы не присвоим значение этой переменной, нам необходимо получить все группы ресурсов из всей подписки azure. Пожалуйста, предложите.

Это код, который мы используем

$excel=@()
    $list = Get-AznetworkInterface |where-Object {$_.ResourceGroupName -Clike '*$(givenVarible)'} |Select-Object
    foreach ($i in $list) {
   $x = " " | Select-Object SID1_name,SID1_VIP,SID2_name,SID2_VIP,SID3_name,SID3_VIP
   $case =1
   While ($case -1t $i.IpConfigurations.Count)
   {
   switch ($case){
   1 {
      $x.SID1_name = $i.IPconfigurations[$case];
     $x.SID1_VIP = $i.IPconfigurations[$case].PrivateIpaddress;
     break
     }
    2 {
     $x.SID2_name = $i.IPconfigurations[$case];
     $x.SID2_VIP = $i.IPconfigurations[$case].PrivateIpaddress;
     break
     }
    3 {
    $x.SID1_name = $i.IPconfigurations[$case];
     $x.SID1_VIP = $i.IPconfigurations[$case].PrivateIpaddress;
     break
     }
     $case =$case+1
     $excel +=$x
     $excel | Format-Table SID1_name,SID1_VIP,SID2_name,SID2_VIP,SID3_name,SID3_VIP
     $excel |Export-Csv  -NTI - Path "$(Build.ArtifactoryStagingDirectory)/report.csv"

1 Ответ

0 голосов
/ 09 мая 2020

Похоже, вам просто нужно добавить блок Param, чтобы вы могли указать этот параметр. Однако, если вам нужны все Azure сетевые интерфейсы, вам просто нужно использовать Get-AzNetworkInterface без параметров.

Param (
    # Mandatory=$false ensures that the user does not have to specify this information.
    [parameter(Mandatory=$false)][string]$ResourceGroup
)

# Checks if the user has used the parameter
if ($PSBoundParamters.ContainsKey('ResourceGroup')) {
    $list = Get-AznetworkInterface |where-Object {$_.ResourceGroupName -Clike $ResourceGroup} |Select-Object
}
else {
    $List = Get-AzNetworkInterface
}
# Rest of script

Затем вы запустите его следующим образом:

PS C:\My_Dir> .\MyScript.ps1 -ResourceGroup MyResourceGroupName

Или без параметров для получения всех сетевых интерфейсов.

PS C:\My_Dir> .\MyScript.ps1

На что следует обратить внимание:

  • Если вы не знаете, clike учитывает регистр. Я не думаю, что именование групп ресурсов в Azure чувствительно к регистру, поэтому, вероятно, лучше просто использовать -like.
  • Select-Object выбирает выбранные свойства из объекта, поэтому в этом нет необходимости в вашем сценарии. Если вам нужно только имя или другие значения c из сетевого интерфейса, вы должны использовать ... | Select-Object -Property Name,IP,etc.
  • ResourceGroupName - это параметр Get-AzNetworkInterface, поэтому вы можете просто укажите имя в параметре. Использование Where-Object излишне.
$list = Get-AzNetworkInterface -ResourceGroupName $ResourceGroup
  • Вы должны проверить значение null в том случае, если пользователь использует группу ресурсов, которая не содержит ресурсов сетевого интерфейса.

Кстати, вам не хватает закрывающего набора фигурных скобок для while l oop, и нет необходимости использовать break в операторе switch, потому что он не имеет повторяющихся условий.

РЕДАКТИРОВАТЬ

На самом деле вы могли бы заменить свои while l oop и switch меньшим фрагментом кода, в пределах l oop . Я тестировал несколько составных объектов.

for ($Count = 0; $count -lt $i.IpConfigurations.Count; $count++) {
    $x."SID$($count + 1)_name" = $i.IPConfigurations[$Count].Name
    $x."SID$($count + 1)_VIP" = $i.IPConfigurations[$Count].PrivateIpAddress
}

Возвращает:

SID1_name : @{IP=192.168.1.1; AdapterName=Test; PrivateIpAddress=192.168.1.1}
SID1_VIP  : 192.168.1.1
SID2_name : @{IP=192.168.1.2; AdapterName=Test2; PrivateIpAddress=192.168.1.2}
SID2_VIP  : 192.168.1.2
SID3_name : @{IP=192.168.1.3; AdapterName=Test3; PrivateIpAddress=192.168.1.3}
SID3_VIP  : 192.168.1.3

Как это работает?

Имена параметров принимают переменная, поэтому вам не нужно их повторять, а также, если существует более трех объектов или конфигураций IP, вам не нужно указывать их специально в вашем скрипте. Вы даже можете использовать Add-Member для динамического создания их по мере необходимости. Просто нужно помнить, что первым объектом в массиве является значение 0, и вы начинаете соглашение о нумерации ваших параметров с 1, поэтому в имени параметра необходим плюс 1.

Вот пример динамического добавления ваших участников:

$x = New-Object psobject
for ($Count = 0; $count -le $i.IpConfigurations.Count; $count++) {
    $x | Add-Member -MemberType NoteProperty -Name "SID$($Count + 1)_Name" -Value $i.IPConfigurations[$Count].Name
    $x | Add-Member -MemberType NoteProperty -Name "SID$($Count + 1)_VIP" -Value $i.IPConfigurations[$Count].PrivateIpAddress
}

Предлагаемый сценарий.

Param (
    # Mandatory=$false ensures that the user does not have to specify this information.
    [parameter(Mandatory=$false)][string]$ResourceGroup
)
$Excel = @()

# Checks if the user has used the parameter
if ($PSBoundParameters.ContainsKey('ResourceGroup')) {
    $List = Get-AzNetworkInterface -ResourceGroupName $ResourceGroup # | Select-Object -Property Name,IPConfigurations # Uncomment to select these properties
}
else {
    $List = Get-AzNetworkInterface # | Select-Object -Property Name,IPConfigurations # Uncomment to select these properties
}

# If you don't have any results, no need to continue.
if ($null -ne $List) {
    foreach ($i in $List) {
        $x = New-Object psobject
        for ($Count = 0; $count -le $i.IpConfigurations.Count; $count++) {
            # Add member properties as they are required
            $x | Add-Member -MemberType NoteProperty -Name "SID$($Count + 1)_Name" -Value $i.IPConfigurations[$Count].Name
            $x | Add-Member -MemberType NoteProperty -Name "SID$($Count + 1)_VIP" -Value $i.IPConfigurations[$Count].PrivateIpAddress
        }
        # Update your array
        $Excel += $x
    }
    # Export directly to CSV, no need to use Format-Table here, unless you want to see the output in the console too.
    $Excel | Export-Csv -Path C:\Test\SampleReport.csv -NoClobber -NoTypeInformation -Encoding UTF8 -Force
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...