none
PoSH: Runspace, Pipeline - не удается передать объект из одного потока исполнения в другой RRS feed

  • Общие обсуждения

  • Доброго времени суток!

    Возникают сложности при передаче объектов из одного runspace в другой.
    С передачей строки текста все отлично, а когда речь заходит, например, о массивах, начинаются проблемы. Что само по себе странно для такого объектно-ориентированного языка, как PowerShell.

    ################################################################################  
    # Тестирование передачи данных между потоками исполнения  
    # Имя: PipelineAndObjects.ps1  
    # Язык: PoSH 1.0  
    # Разработчик: Ilya A. Lushnikov  
    ################################################################################  
     
     
    # Функция записи строки отчета в файл.  
    # В начало строки ставятся текущие дата и время  
    Function WriteLog {  
        Param ([string]$TextToWrite)  
        $ReportFile = "$env:userprofile\IlyaLogs\pipeline-and-objects-report.txt" 
        $WriteString="[" 
        $WriteString+=(Get-Date -Format "dd.MM.yyyy HH:mm:ss" | Out-String).Trim("`n").Trim("`r")  
        $WriteString+="]"  
        $WriteString+="$TextToWrite"  
        $WriteString | Out-File $ReportFile -Append  
    }  
     
     
    WriteLog "Main pipeline start"  
     
    $Pipeline2Command={  
     
        # Функция записи строки отчета в файл.  
        # В начало строки ставятся текущие дата и время  
        Function WriteLog {  
            Param ([string]$TextToWrite)  
            $ReportFile = "$env:userprofile\IlyaLogs\pipeline-and-objects-report.txt" 
            $WriteString="[" 
            $WriteString+=(Get-Date -Format "dd.MM.yyyy HH:mm:ss" | Out-String).Trim("`n").Trim("`r")  
            $WriteString+="]"  
            $WriteString+="$TextToWrite"  
            $WriteString | Out-File $ReportFile -Append  
            }  
                      
        WriteLog "Pipeline 2 Start"  
        $Pipeline2Input=$input  
        WriteLog "Содержимое Pipeline2Input в pipeline2: $Pipeline2Input"  
        $Pipeline2Object0=$Pipeline2Input[0]  
        WriteLog "Pipeline2Input[0] в pipeline2: $Pipeline2Object0"  
     
        }  
                      
     
    $Pipeline2Input=@("first","second","third")  
    WriteLog "Содержимое Pipeline2Input в основном pipeline: $Pipeline2Input"  
    $Pipeline2Object0=$Pipeline2Input[0]  
    WriteLog "Pipeline2Input[0] в основном pipeline: $Pipeline2Object0"  
     
    $Runspace2=[Management.Automation.Runspaces.RunspaceFactory]::CreateRunspace()  
    $Runspace2.Open()  
    $Pipeline2=$Runspace2.CreatePipeline($Pipeline2Command)  
    $Pipeline2.Input.Write($Pipeline2Input,$True)  
    $Pipeline2.Input.Close()  
    $Pipeline2.InvokeAsync()  
              
     
     

    Создается впечатление, что в Pipeline2 передается не сам массив, а некая его текстовая интерпретация.
    В частности, в Pipeline2 не удается обратиться к элементам массива, а некорректно сообщается о его свойстве Length.

    Вот что дает результат выполнения указанного скрипта (лог-файл):

    [26.02.2009 23:21:40]Main pipeline start  
    [26.02.2009 23:21:40]Содержимое Pipeline2Input в основном pipeline: first second third  
    [26.02.2009 23:21:40]Pipeline2Input[0] в основном pipeline: first  
    [26.02.2009 23:21:40]Pipeline 2 Start  
    [26.02.2009 23:21:40]Содержимое Pipeline2Input в pipeline2: first second third 

    Обратите внимание, что строка "Pipeline2Input[0] в pipeline2:" не выводится вообще - судя по всему, при попытке получить значение Pipeline2Input[0] произошла некая ошибка.

    Вопрос: как корректно передать массив элементов из одного pipeline в другой?

    MCP
    26 февраля 2009 г. 18:31