none
Не удается индексировать в объект типа System.Management.Automation.PSObject. RRS feed

  • Вопрос

  • Всем привет.

    Есть скрипт на PS. Он считывает параметры из csv и импортирует шаблон на vcenter. При выполнении выдает ошибку:

    Не удается индексировать в объект типа System.Management.Automation.PSObject.
    C:\temp\TemplateCopy.ps1:49 знак:55
    +     $session = @(New-PsSession -ComputerName $VMArray[ <<<< 0].VCenterHostName)
        + CategoryInfo          : InvalidOperation: (0:Int32) [], RuntimeException
        + FullyQualifiedErrorId : CannotIndex

    Invoke-Command : Не удается проверить аргумент для параметра "Session". Аргумент пуст, имеет значение NULL, либо элемент коллекции аргументов имеет значение NULL. Предоставьте коллекцию без значений NULL и повторите выполнение команды.
    C:\temp\TemplateCopy.ps1:51 знак:28
    +     Invoke-Command -Session <<<<  $session -ScriptBlock $script -ArgumentList (,$VMArray)
        + CategoryInfo          : InvalidData: (:) [Invoke-Command], ParameterBindingValidationException
        + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.PowerShell.Commands.InvokeCommandCommand

    Remove-PSSession : Не удается привязать аргумент к параметру "Session", так как он представляет собой пустой массив.
    C:\temp\TemplateCopy.ps1:53 знак:30
    +     Remove-PSSession -Session <<<<  $session
        + CategoryInfo          : InvalidData: (:) [Remove-PSSession], ParameterBindingValidationException
        + FullyQualifiedErrorId : ParameterArgumentValidationErrorEmptyArrayNotAllowed,Microsoft.PowerShell.Commands.RemovePSSessionCommand

    Сам код:

    #Блок определения параметров, запуск скрипта из PowerShell подразумевает указания CSV файла со всей информацией.
    #param
    #(
    #    [string]$csvFile = $(throw "-csv file path is required.")
    #)
    #статическое указание файла конфигурации 
    $csvFile = "C:\Temp\TemplateCopy.csv"
    #проверка на существование файла, если его нет (в имени ошибка) - прерывание выполнения скрипта
    if(Test-Path -Path $csvFile)
    {
        $VMCSV = Import-Csv -Path $csvFile
    }
    else
    {
        Write-Host "CSV file not found"
        exit
    }
    #выполняем действия для каждого VCenter:
    foreach($VMArray in $VMCSV) # for each line in CSV
    {
    #начало блока скрипта, который позже будет выслан на сервер VCenter
        $script = {
            
            param($VMArray) # считывание параметров CSV файла
    #проверка возможности загрузки модуля PowerCLI
            Get-PSSnapin VMware.VimAutomation.Core -ErrorAction SilentlyContinue -WarningAction SilentlyContinue -ErrorVariable PSError 
            if($PSError)
            {
                Add-PSSnapin VMware.VimAutomation.Core -ErrorAction SilentlyContinue -WarningAction SilentlyContinue -ErrorVariable SnapInError
                if($SnapInError)
                {
                    "VMware.VimAutomation.Core could not be loaded by the reason $SnapInError"
                    Exit
                }
            }
    #установка конфигурации работы PowerCLI 
            Set-PowerCLIConfiguration -DefaultVIServerMode Multiple -InvalidCertificateAction Ignore -DisplayDeprecationWarnings:$false -Confirm:$false
    #подключение к VCenter серверу
            $vSphere_Connection = Connect-VIServer -Server $VMArray[0].VCenterHostName -User $VMArray[0].VCenterUsername -Password $VMArray[0].VCenterPassword
            "Connection to $vSphere_Connection has been established."
    #импортируем ova
    Import-VApp -Source C:\Temp\winsrv2008tmpl.ova -Name $VMArray[0].TemplateName -VMHost $VMArray[0].VMHostName -Datastore $VMArray[0].VSphereDataStore -Force -Server $VMArray[0].VCenterHostName
    #конвертируем ВМ в шаблон
    set-vm -vm $VMArray[0].TemplateName -Server $VMArray[0].VCenterHostName -ToTemplate -name $VMArray[0].TemplateName
    #отключение от VCenter сервера
            Disconnect-VIServer -Server $vSphere_Connection -Confirm:$false
                          }
    #старт удалённой сессии на VCenter сервер
        $session = New-PsSession -ComputerName $VMArray[0].VCenterHostName
    #передача блока скрипта на выполнение
        Invoke-Command -Session $session -ScriptBlock $script -ArgumentList (,$VMArray)
    #завершение сессии
        Remove-PSSession -Session $session
    }					  
    Гуру PS помогите разобраться что не так.
    1 сентября 2016 г. 11:33

Ответы

  • 1. Версия PowerShell

    2. Привести пример файла  "C:\Temp\TemplateCopy.csv"

    $VMArray - не является массивом и в PowerShell v2.0 вызовет ошибку.

    Т.к. это не массив, то нельзя использовать [0]:

    $VMArray[0].VCenterHostName

    Приведите к виду: $VMArray.VCenterHostName

    Если часть данных массив, а часть нет, то используйте:

    $cName = $VMArray | Select -First 1

    $cName.VCenterHostName

    Еще как вариант, явно приводить к массиву после foreach: 

    $VMArray = (,$VMArray)

    • Изменено KazunEditor 1 сентября 2016 г. 12:38
    • Помечено в качестве ответа Shurepsky 2 сентября 2016 г. 6:49
    1 сентября 2016 г. 12:33
    Отвечающий
  • У Вас нет массива. Поэтому $VMArray[0] замените на $VMArray и -ArgumentList (,$VMArray) на -ArgumentList $VMArray .
    • Изменено KazunEditor 1 сентября 2016 г. 13:09
    • Помечено в качестве ответа Shurepsky 2 сентября 2016 г. 6:49
    1 сентября 2016 г. 13:03
    Отвечающий

Все ответы

  • 1. Версия PowerShell

    2. Привести пример файла  "C:\Temp\TemplateCopy.csv"

    $VMArray - не является массивом и в PowerShell v2.0 вызовет ошибку.

    Т.к. это не массив, то нельзя использовать [0]:

    $VMArray[0].VCenterHostName

    Приведите к виду: $VMArray.VCenterHostName

    Если часть данных массив, а часть нет, то используйте:

    $cName = $VMArray | Select -First 1

    $cName.VCenterHostName

    Еще как вариант, явно приводить к массиву после foreach: 

    $VMArray = (,$VMArray)

    • Изменено KazunEditor 1 сентября 2016 г. 12:38
    • Помечено в качестве ответа Shurepsky 2 сентября 2016 г. 6:49
    1 сентября 2016 г. 12:33
    Отвечающий
  • Версия 2.0.

    Пример CSV:

    VCenterHostName,VCenterUsername,VCenterPassword,VSphereDataStore,VMHostName,TemplateName
    192.168.1.2,user,password,ds-01,server1.domain.ru,winsrv2008tmpl
    192.168.1.3,user,password,ds-02,server3.domain.ru,winsrv2008tmpl1

    • Помечено в качестве ответа Shurepsky 2 сентября 2016 г. 6:49
    • Снята пометка об ответе Shurepsky 2 сентября 2016 г. 6:49
    1 сентября 2016 г. 12:54
  • У Вас нет массива. Поэтому $VMArray[0] замените на $VMArray и -ArgumentList (,$VMArray) на -ArgumentList $VMArray .
    • Изменено KazunEditor 1 сентября 2016 г. 13:09
    • Помечено в качестве ответа Shurepsky 2 сентября 2016 г. 6:49
    1 сентября 2016 г. 13:03
    Отвечающий
  • Ок. Помогло) Спасибо!
    2 сентября 2016 г. 6:50