ForEach внутри ForEach? - PullRequest
       0

ForEach внутри ForEach?

1 голос
/ 05 марта 2020

То, что я пытаюсь сделать, это l oop через $ uriProcess для $ ProjectProcessConfiguration и $ FieldControlConfiguration для каждого типа рабочего элемента и страницы.

$AzureDevOpsAuthenicationHeader = @{Authorization = 'Basic ' + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$(PAT)")) }

$projectProcessConfiguration= @{ 
 "controlls"= "null"                        
  "id"= "null"
  "label"= "Company"
  "order"= "0"
  "overridden"= "null"
  "inherited"= "null"
  "visible"= "true"
}  | ConvertTo-Json -Depth 5

$FieldControlConfiguration = @{ 
  "id"= "Custom.ID"
  "label"= "ID"
  "controlType"= "FieldControl"
  "readOnly"= "true"
  "visible"= "true"
  "isContribution"= "false"
}  | ConvertTo-Json -Depth 5

$uriProcess= "https://dev.azure.com/$(Company)/_apis/work/processes/$(CMMI)/workItemTypes/CMMIinherited.Bug/layout/pages/CMMI.Bug.Bug/sections/Section3/groups?api-version=5.0-preview.1"
Invoke-RestMethod -uri $uriProcess -Method POST -Headers $AzureDevOpsAuthenicationHeader -Body $projectProcessConfiguration -ContentType "application/json"

Таким образом, каждый из них будет использоваться для создания всего 9 URL:

$Pages= "CMMI.Bug.Bug","CMMI.ChangeRequest.ChangeRequest","CMMI.Epic.Epic","CMMI.Feature.Feature","CMMI.Issue.Issue","CMMI.Requirement.Requirement","CMMI.Review.Review","CMMI.Risk.Risk","CMMI.Task.Task"

$WorkItems="CMMIinherited.Bug","CMMIinherited.ChangeRequest","CMMIinherited.Epic","CMMIinherited.Feature","CMMIinherited.Issue","CMMIinherited.Requirement","CMMIinherited.Review","CMMIinherited.Risk","CMMIinherited.Task"

Отправка только одного из них будет выглядеть следующим образом:

$uriProcess= "https://dev.azure.com/$(Company)/_apis/work/processes/$(CMMI)/workItemTypes/CMMIinherited.Bug/layout/pages/CMMI.Bug.Bug/sections/Section3/groups?api-version=5.0-preview.1"

Следующий будет выглядеть следующим образом:

$uriProcess= "https://dev.azure.com/$(Company)/_apis/work/processes/$(CMMI)/workItemTypes/CMMIinherited.ChangeRequest/layout/pages/CMMI.ChangeRequest.ChangeRequest/sections/Section3/groups?api-version=5.0-preview.1"

Надеемся в этом есть смысл.

Я хочу создать 9 URL-адресов, каждый из которых имеет свои особые значения, и отправить каждый через Invoke-Restmethod

Я думал, что foreach l oop, но мои "$ pages" и "$ WorkItems ", кажется, не выстраиваются в foreach, поэтому я получаю плохие результаты. Похоже, это не очень хороший способ сделать это в любом случае. Любой совет, как это можно сделать в простом макете?

Ответы [ 2 ]

0 голосов
/ 05 марта 2020

Не используйте Write-Host, если вы планируете использовать данные в другом месте.

Write-host не нужен для отправки вывода на экран, то есть по умолчанию PowerShell. Если вы абсолютно «хотите» использовать запись по каким-либо причинам, выберите вместо нее «Запись-Вывод».

Вы можете назначить переменную и одновременно вывести на экран, используя сжатие переменной. Тем не менее, действительно, делайте это только для сеансов разработки и отладки или если вы действительно планируете постоянно выводить этот вывод на экран.

Покажите ожидаемые результаты, вместо того, чтобы заставлять людей предполагать или угадывать. Какие ошибки происходят? Когда я делаю это с вашим примером, результаты получаются без ошибок, хотя есть несколько странных форматов.

# Simple string only needs single quotes. Double is for expansion needs and specific formatting 
$Org       = 'MyOrgName'
$CMMI      = 'MyCMMIThingy'
$Pages     = 'C.Bug','C.Change','C.Epic'
$WorkItems = 'Bug','Change','Epic'

ForEach ($WorkItemTypes in $WorkItems) # This will happen 3 times
{
    # Assign the results to the variable for later use, while outputting to the screen
    '*'*60
    "*** Processing worktypes named $WorkItemTypes ***"
    '*'*60
    ($uriProcess2 = "https://dev.azure.com/$Org/_apis/work/processes/$CMMI/workItemTypes/$WorkItemTypes/layout/pages/")

    ForEach ($PageTypes in $Pages) # This will happen 3 times for each of $WorkItems
    {
        # Assign the results to the variable for later use, while outputting to the screen
        '*'*60
        "*** Processing page types name $PageTypes  for worktypes named $WorkItemTypes for the Invoke command ***"
        '*'*60
        ($uriProcess3 = "$PageTypes/sections/Section3/groups?api-version=5.0-preview.1")
        <#
        Assign the results to the variable for later use, while outputting to the screen
        Using splatting for readability
        #>
        ($uriProcess = $uriProcess2 + $uriProcess3)
        <#
        $invokeRestMethodSplat = @{
            ContentType = 'application/json'
            Method = 'POST'
            Body = $projectProcessConfiguration
            Headers = $AzureDevOpsAuthenicationHeader
            Uri = $uriProcess
        }
        Invoke-RestMethod @invokeRestMethodSplat
        #>
    }
}

<#
# Results


************************************************************
*** Processing worktypes named Bug ***
************************************************************
https://dev.azure.com/MyOrgName/_apis/work/processes/MyCMMIThingy/workItemTypes/Bug/layout/pages/
************************************************************
*** Processing page types name C.Bug  for worktypes named Bug for the Invoke command ***
************************************************************
C.Bug/sections/Section3/groups?api-version=5.0-preview.1
https://dev.azure.com/MyOrgName/_apis/work/processes/MyCMMIThingy/workItemTypes/Bug/layout/pages/C.Bug/sections/Section3/groups?api-version=5.0-preview.1   
************************************************************
*** Processing page types name C.Change  for worktypes named Bug for the Invoke command ***
************************************************************
C.Change/sections/Section3/groups?api-version=5.0-preview.1
https://dev.azure.com/MyOrgName/_apis/work/processes/MyCMMIThingy/workItemTypes/Bug/layout/pages/C.Change/sections/Section3/groups?api-version=5.0-preview.1************************************************************
*** Processing page types name C.Epic  for worktypes named Bug for the Invoke command ***
************************************************************
C.Epic/sections/Section3/groups?api-version=5.0-preview.1
https://dev.azure.com/MyOrgName/_apis/work/processes/MyCMMIThingy/workItemTypes/Bug/layout/pages/C.Epic/sections/Section3/groups?api-version=5.0-preview.1  
************************************************************
*** Processing worktypes named Change ***
************************************************************
https://dev.azure.com/MyOrgName/_apis/work/processes/MyCMMIThingy/workItemTypes/Change/layout/pages/
************************************************************
*** Processing page types name C.Bug  for worktypes named Change for the Invoke command ***
************************************************************
C.Bug/sections/Section3/groups?api-version=5.0-preview.1
https://dev.azure.com/MyOrgName/_apis/work/processes/MyCMMIThingy/workItemTypes/Change/layout/pages/C.Bug/sections/Section3/groups?api-version=5.0-preview.1************************************************************
*** Processing page types name C.Change  for worktypes named Change for the Invoke command ***
************************************************************
C.Change/sections/Section3/groups?api-version=5.0-preview.1
https://dev.azure.com/MyOrgName/_apis/work/processes/MyCMMIThingy/workItemTypes/Change/layout/pages/C.Change/sections/Section3/groups?api-version=5.0-preview.1
************************************************************
*** Processing page types name C.Epic  for worktypes named Change for the Invoke command ***
************************************************************
C.Epic/sections/Section3/groups?api-version=5.0-preview.1
https://dev.azure.com/MyOrgName/_apis/work/processes/MyCMMIThingy/workItemTypes/Change/layout/pages/C.Epic/sections/Section3/groups?api-version=5.0-preview.1
************************************************************
*** Processing worktypes named Epic ***
************************************************************
https://dev.azure.com/MyOrgName/_apis/work/processes/MyCMMIThingy/workItemTypes/Epic/layout/pages/
************************************************************
*** Processing page types name C.Bug  for worktypes named Epic for the Invoke command ***
************************************************************
C.Bug/sections/Section3/groups?api-version=5.0-preview.1
https://dev.azure.com/MyOrgName/_apis/work/processes/MyCMMIThingy/workItemTypes/Epic/layout/pages/C.Bug/sections/Section3/groups?api-version=5.0-preview.1
************************************************************
*** Processing page types name C.Change  for worktypes named Epic for the Invoke command ***
************************************************************
C.Change/sections/Section3/groups?api-version=5.0-preview.1
https://dev.azure.com/MyOrgName/_apis/work/processes/MyCMMIThingy/workItemTypes/Epic/layout/pages/C.Change/sections/Section3/groups?api-version=5.0-preview.1
************************************************************
*** Processing page types name C.Epic  for worktypes named Epic for the Invoke command ***
************************************************************
C.Epic/sections/Section3/groups?api-version=5.0-preview.1
https://dev.azure.com/MyOrgName/_apis/work/processes/MyCMMIThingy/workItemTypes/Epic/layout/pages/C.Epic/sections/Section3/groups?api-version=5.0-preview.1
#>

Вы получаете 3 элемента для каждого, потому что это то, о чем вы просите делать через вложенный l oop.

Всякий раз, когда вы работаете для отладки итераций / циклов, всегда go с наименьшим количеством кода, чтобы убедиться, что вы получаете базовые результаты, которые вы после .. .

$Pages     = 'C.Bug','C.Change','C.Epic'
$WorkItems = 'Bug','Change','Epic'

ForEach ($WorkItemTypes in $WorkItems)
{
    " Work type is `"$WorkItemTypes`""       
    ForEach ($PageTypes in $Pages)
    {"Page type is $PageTypes and work type is `"$WorkItemTypes`""}
}

<#
# Results

 Work type is "Bug"
Page type is C.Bug and work type is "Bug"
Page type is C.Change and work type is "Bug"
Page type is C.Epic and work type is "Bug"
 Work type is "Change"
Page type is C.Bug and work type is "Change"
Page type is C.Change and work type is "Change"
Page type is C.Epic and work type is "Change"
 Work type is "Epic"
Page type is C.Bug and work type is "Epic"
Page type is C.Change and work type is "Epic"
Page type is C.Epic and work type is "Epic"
#>

Обновление

В соответствии с моим комментарием к вам, выполните это действие, потому что, как написано в вашем комментарии, я понятия не имею, что это должно быть ...

В конечном итоге я хочу получить это в качестве вывода: Тип работы "Ошибка" Тип страницы C. Ошибка и тип работы "Ошибка" Тип работы - «Изменить». Тип страницы - C. Изменить и тип работы - «Изменить». Тип работы - «Epi c». Тип страницы - C .Epi c, а тип работы - «Эпи c». "

... или действительно означает для вас конечные результаты варианта использования. Тем не менее, все oop никогда не будут обрабатывать таким образом, каким и каким образом вы его предоставили.

Даже если разбить это на сегменты, я сейчас почесал голову.

Work type is "Bug" Page type is C.Bug 
and 
work type is "Bug" 
Work type is "Change" Page type is C.Change 
and 
work type is "Change" 
Work type is "Epic" Page type is C.Epic 
and 
work type is "Epic"

Вы перебираете список, каждый элемент обрабатывается только один раз. Если бы я сделал часть того, что у вас здесь, как al oop, используя многомерный массив, вы можете сделать это.

Clear-Host
$Org       = 'MyOrgName'
$CMMI      = 'MyCMMIThingy'
$Counter   = -1
# Using multi-dimentional arrays
$WorkItems = @('Bug','Change','Epic'),@('C.Bug','C.Change','C.Epic')
$WorkItems[0] | 
ForEach{
    $Counter++
    ($uriProcess2 = "https://dev.azure.com/$Org/_apis/work/processes/$CMMI/workItemTypes/$($WorkItems[0][$Counter])/layout/pages/$($WorkItems[1][$Counter])")

}

<#
# Results

https://dev.azure.com/MyOrgName/_apis/work/processes/MyCMMIThingy/workItemTypes/Bug/layout/pages/C.Bug
https://dev.azure.com/MyOrgName/_apis/work/processes/MyCMMIThingy/workItemTypes/Change/layout/pages/C.Change
https://dev.azure.com/MyOrgName/_apis/work/processes/MyCMMIThingy/workItemTypes/Epic/layout/pages/C.Epic
#>
0 голосов
/ 05 марта 2020
 $Pages= "C.Bug","C.Change","C.Epic"
    $WorkItems= "Bug","Change","Epic"

    ForEach ($WorkItemTypes in $WorkItems)
    {
        $uriProcess2= "https://dev.azure.com/`$Org/_apis/work/processes/`$CMMI/workItemTypes/$WorkItemTypes/layout/pages/"
        Write-Host $uriProcess2    
        ForEach ($PageTypes in $Pages)        {
            $uriProcess3= "$PageTypes/sections/Section3/groups?api-version=5.0-preview.1"
            Write-Host $uriProcess3
            $uriProcess= $uriProcess2 + $uriProcess3
            Write-Host $uriProcess 
            Invoke-RestMethod -uri $uriProcess -Method POST -Headers $AzureDevOpsAuthenicationHeader -Body $projectProcessConfiguration -ContentType "application/json"
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...