Доброго времени суток!
Возникают сложности при передаче объектов из одного 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