Проблемы с пониманием рабочего процесса Powershell ForEach

Я пытаюсь освоить рабочие процессы Powershell и некоторую работу, которую мне нужно выполнять параллельно.

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

$operations = ,("Item0", "Item1")

ForEach ($operation in $operations) {
    Write-Output "Item0: $($operation.Item(0)) Item1: $($operation.Item(1))"
}

workflow operationsWorkflow{
    Write-Output "Running Workflow"
    $operations = ,("Item0", "Item1")
    ForEach -Parallel ($operation in  $operations) {
        #Fails: Method invocation failed because [System.String] does not contain a method named 'Item'.
        #Write-Output "Item0: $($operation.Item(0)) Item1: $($operation.Item(1))"

        Write-Output "Item $operation"
    }
}

operationsWorkflow

person Stanley.Goldman    schedule 05.07.2016    source источник
comment
Пока все, что я могу сказать, это то, что в этом случае трюк с запятой не работает для создания массива. Моим первым предположением было бы использовать .NET [System.Collections.Generic.List[string[]]] или что-то подобное вместо того, чтобы полагаться на магию массива powershell.   -  person Eris    schedule 06.07.2016
comment
Примечание: даже закомментированная строка работает, если $operations добавлено более одного элемента массива. пример: $operations = @(("Item0", "Item1"), ("ItemA", "ItemB"))   -  person Eris    schedule 06.07.2016
comment
Я хочу любить powershell, но меня это всегда смущает...   -  person Stanley.Goldman    schedule 06.07.2016
comment
Спасибо, Эрис, я еще не проверял, будет ли работать более одного элемента, просто застрял на первом шаге. Так что, по крайней мере, я могу продолжать то, что я делал, пока мы ждем ответа.   -  person Stanley.Goldman    schedule 06.07.2016
comment
Я действительно рекомендую подать заявку на Connect об этом. Не уверен, что это специфично для параллельного или рабочего процесса.   -  person Eris    schedule 06.07.2016


Ответы (1)


Проблема решена благодаря этой отличной статье о powershell массивы

Теперь, поскольку это уже массив, его повторное приведение не приводит к второму уровню вложенности:

PS (66) > $a = [массив] [массив] 1

PS (67) > $a[0]

1

Однако использование двух запятых делает вложением массива, поскольку это операция построения массива:

PS (68) > $a = ,,1

PS (69) > $a[0][0]

1

Учитывая это, это отлично работает:

workflow operationsWorkflow{
    Write-Output "Running Workflow"
    $operations = ,,("Item0", "Item1")
    ForEach -Parallel ($operation in  $operations) {
            Write-Output "Item0: $($operation.Item(0)) Item1: $($operation.Item(1))"
    }
}

operationsWorkflow

Однако если вторая запятая ставится вне рабочего процесса, то там возникают ошибки. Так что это workflow или parallel конкретная проблема и обходной путь.

person Eris    schedule 06.07.2016