Похоже, вам просто нужно добавить блок 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
}