我有一个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"
答案 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
。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
}