Хеш-таблица Powershell: не удается преобразовать значение «System.Коллекции.Хеш-таблица» в тип «Microsoft.PowerShell.Командная обработка.GeneratedTypes»

#powershell #hashtable #lookup-tables

#powershell #хэш-таблица #таблицы поиска

Вопрос:

Я пытаюсь назначить новые IP-адреса вновь развернутым виртуальным машинам, используя приведенный ниже сценарий

     $newVmList = @(
        @{"Name" = "TESTVM21"; "NetworkName" = "LS_10.123.16.0/22"; "IPAddress" = "10.123.19.250"; "PrefixLength" = "22"; "DefaultGateway" = "10.123.16.1"; "IfAlias" = "Ethernet0"; "IPFamily" = "IPv4"; "DNS" = "10.163.4.14, 10.163.4.15";}
        @{"Name" = "TESTVM31"; "NetworkName" = "LS_10.123.16.0/22"; "IPAddress" = "10.123.19.251"; "PrefixLength" = "22"; "DefaultGateway" = "10.123.16.1"; "IfAlias" = "Ethernet0"; "IPFamily" = "IPv4"; "DNS" = "10.163.4.14, 10.163.4.15";}
    )
    $setIP = "New-NetIPAddress –InterfaceAlias ""$vm.IfAlias"" -AddressFamily ""$vm.IPFamily"" -IPAddress ""$vm.IPAddress"" -PrefixLength ""$vm.PrefixLength"" -DefaultGateway ""$vm.DefaultGateway"""
    $setDNS = "Set-DnsClientServerAddress -InterfaceAlias ""$vm.IfAlias"" -ServerAddresses ""$vm.DNS"""
    
    Foreach($VM in $newVmList) { 
        Invoke-VMScript -VM $VM.Name -GuestCredential $GuestAccount -ScriptText $setIP
        Invoke-VMScript -VM $VM.Name -GuestCredential $GuestAccount -ScriptText $setDNS
    }
 

Но, похоже, возникла проблема с моим скриптом, использующим строку в качестве типа ввода для параметра. Я просмотрел пару потоков, но мне не удалось изменить свой скрипт с помощью предоставленных решений. Может кто-нибудь помочь мне это исправить?

 ScriptOutput
--------------------------------------------------------------------------------------
|  New-NetIPAddress : Cannot process argument transformation on parameter
|  'AddressFamily'. Cannot convert value "System.Collections.Hashtable.IPFamily"
|  to type "Microsoft.PowerShell.Cmdletization.GeneratedTypes.NetIPAddress.Address
|  Family". Error: "Unable to match the identifier name
|  System.Collections.Hashtable.IPFamily to a valid enumerator name.  Specify one
|  of the following enumerator names and try again: IPv4, IPv6"
|  At line:1 char:91
|    ... -AddressFamily "System.Collections.Hashtable.IPFamily" -IPAddress
|  "System.Collec ...
|                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|        CategoryInfo          : InvalidData: (:) [New-NetIPAddress], ParameterBi
|     ndingArgumentTransformationException
|        FullyQualifiedErrorId : ParameterArgumentTransformationError,New-NetIPAd
|     dress
|
|
--------------------------------------------------------------------------------------
ScriptOutput
--------------------------------------------------------------------------------------
|  Set-DnsClientServerAddress : No MSFT_DNSClientServerAddress objects found with
|  property 'InterfaceAlias' equal to 'System.Collections.Hashtable.IfAlias'.
|  Verify the value of the property and retry.
|  At line:1 char:4
|    amp; {Set-DnsClientServerAddress -InterfaceAlias
|  "System.Collections.Hashtable.IfAl ...
|    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|  ~~~
|        CategoryInfo          : ObjectNotFound: (System.Collections.Hashtable.If
|     Alias:String) [Set-DnsClientServerAddress], CimJobException
|        FullyQualifiedErrorId : CmdletizationQuery_NotFound_InterfaceAlias,Set-D
|     nsClientServerAddress
|
|
--------------------------------------------------------------------------------------
 

Комментарии:

1. Я переместил $setIP и $setDNS внутри блока Foreach, но это ничего не изменило. Я подозреваю, что с этим что-то связано Error: "Unable to match the identifier name System.Collections.Hashtable.IPFamily to a valid enumerator name. Specify one of the following enumerator names and try again: IPv4, IPv6" , хотя $VM.IPFamily и имеет значение.

2. Спасибо @CFou. Ваш синтаксис сработал. Я не знаю, как пометить ваш комментарий как Answer

3. @CFou: пожалуйста, отправьте то же, что и ответ .. и пусть joso пометит его как принятый.

4. Готово :), теперь вы можете отметить это 🙂 рад, что это помогает

Ответ №1:

Ваши переменные должны быть определены внутри ForEach блока ( $vm не существует ранее), а не раньше. Переместите ваши $setIP $setDNS объявления и непосредственно перед первым Invoke-VMSCript .

И используйте этот синтаксис :

 $setIP = "New-NetIPAddress –InterfaceAlias $($vm.IfAlias) -AddressFamily $($vm.IPFamily) -IPAddress $($vm.IPAddress) -PrefixLength $($vm.PrefixLength) -DefaultGateway $($vm.DefaultGateway)" 
$setDNS = "Set-DnsClientServerAddress -InterfaceAlias $($vm.IfAlias) -ServerAddresses $($vm.DNS)"
 

Итак, у вас должно быть это :

 $newVmList = @(
   @{"Name" = "TESTVM21"; "NetworkName" = "LS_10.123.16.0/22"; "IPAddress" = "10.123.19.250"; "PrefixLength" = "22"; "DefaultGateway" = "10.123.16.1"; "IfAlias" = "Ethernet0"; "IPFamily" = "IPv4"; "DNS" = "10.163.4.14, 10.163.4.15";}
   @{"Name" = "TESTVM31"; "NetworkName" = "LS_10.123.16.0/22"; "IPAddress" = "10.123.19.251"; "PrefixLength" = "22"; "DefaultGateway" = "10.123.16.1"; "IfAlias" = "Ethernet0"; "IPFamily" = "IPv4"; "DNS" = "10.163.4.14, 10.163.4.15";}
)
    
Foreach($VM in $newVmList) { 
   $setIP = "New-NetIPAddress –InterfaceAlias $($vm.IfAlias) -AddressFamily $($vm.IPFamily) -IPAddress $($vm.IPAddress) -PrefixLength $($vm.PrefixLength) -DefaultGateway $($vm.DefaultGateway)" 
   $setDNS = "Set-DnsClientServerAddress -InterfaceAlias $($vm.IfAlias) -ServerAddresses $($vm.DNS)"
   Invoke-VMScript -VM $VM.Name -GuestCredential $GuestAccount -ScriptText $setIP
   Invoke-VMScript -VM $VM.Name -GuestCredential $GuestAccount -ScriptText $setDNS
}