在运行Azure DevOps管道时,如果我们不给管道的Powershell脚本中使用的变量赋予任何值

时间:2020-05-09 04:10:16

标签: azure powershell azure-devops azure-powershell

我有一个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 :(得分:0)

看起来您只需要添加一个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从对象中选择选定的属性,因此在脚本中没有必要。如果只需要网络接口中的名称或其他特定值,则可以使用... | Select-Object -Property Name,IP,etc
  • ResourceGroupName是Get-AzNetworkInterface的参数,因此您只需在参数中指定名称即可。使用Where-Object是多余的。
$list = Get-AzNetworkInterface -ResourceGroupName $ResourceGroup
  • 如果用户使用的资源组不包含任何网络接口资源,则应检查是否为空。

顺便说一句,您在while循环中缺少一组闭合的花括号,并且在switch语句中不必使用break,因为它没有重复的条件

编辑

实际上,您可以在for循环内用较小的代码段替换while循环和switch。我测试了一些人造物体。

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
}