PowerShell перебирает массив объектов и находит - PullRequest
0 голосов
/ 28 мая 2018

У меня есть объект в PowerShell, возвращенный VSTS, который выглядит следующим образом (! Важно: нет @ {вокруг этих элементов, отредактированных Томалаком):

  @{
    objectId="ae97aa664f6c0cf803790a1fad78fc43119c6b8a"
    gitObjectType="tree"
    commitId="696e3462ef20058c4f3183d28568196d30f7e18f"
    path="/"
    isFolder=True
    url="https://xxx.visualstudio.com/_apis/git/repositories/11f25afb-4130-499b-ae49-d3fe24b0fadb/items//?versionType=Branch&versionOptions=None"
  },
  @{
    objectId="e12eb8bd619733492279a8f8c8e0de99378dd299"
    gitObjectType="blob"
    commitId="696e3462ef20058c4f3183d28568196d30f7e18f"
    path="/Hello.ps1" 
    url="https://xxx.visualstudio.com/_apis/git/repositories/11125afb-4730-119b-ae49-d3fe24b0fadb/items//Hello.ps1?versionType=Branch&versionOptions=None"
  },
  @{
    objectId="a4579b63a5cf68ca6a95937d56f15bac47a4f768"
    gitObjectType="blob" 
    commitId="696e3462ef20058c4f3183d28568196d30f7e18f"
    path="/README.md"
    url="https://xxx.visualstudio.com/_apis/git/repositories/48f25afb-4730-499b-ae49-d3fe24b0fadb/items//README.md?versionType=Branch&versionOptions=None"
  },
  @{
    objectId="46e9b94f49b5a687c889f451c3a9b315e6044b7c" 
    gitObjectType="blob"
    commitId="696e3462ef20058c4f3183d28568196d30f7e18f"
    path="/file.txt"
    url="https://xxx.visualstudio.com/_apis/git/repositories/11f25afb-4130-499b-ae49-d3fe24b0fadb/items//file.txt?versionType=Branch&versionOptions=None"
  }

Он сохраняется в переменной $xmlDataRepo.Когда я делаю

$xmlDataRepo | ForEach-Object {
    write-host $xmlDataRepo.value.commitId
} 

, я получаю (! Важно, эти значения действительно записываются в одну строку в окне PowerShell!):

696e3462ef20058c4f3183d28568196d30f7e18f 696e3462ef20058c4f3183d28568196d30f7e18f 696e3462ef20058c4f3183d28568196d30f7e18f 696e3462ef20058c4f3183d28568196d30f7e18f

, что выглядит хорошо.Но то, что нужно сделать, это найти объект с path=/file.txt, а затем получить только эти объекты objectId.

Я пробовал это с этим, но он не работает:

$filename = "file.txt"

ForEach-Object -InputObject $xmlDataRepo.value -Process {
  if ($xmlDataRepo.value.path -eq "/$filename") {
    $oId = $xmlDataRepo.value.objectId
  } else {
    $oId = "0000000000000000000000000000000000000000"
  }
}

Что здесь не так?

Обновление 1:

Я попробовал следующий код:

$xmlDataRepo | ForEach-Object {
    if ($_.value.path -eq "/$filename") {
        write-host $_.value.objectId
    }
}

Я также попробовал

$obj = ($xmlDataRepo | Where-Object { $_.value.path -eq "/$filename" })

if ($obj) { 
    $oldId = $_.value.commitId
} else {
    $oldId = "0000000000000000000000000000000000000000"
}

Это объект при отладке.Но я всегда получаю 4 значения (!) Вместо одного, где имя файла совпадает с именем файла в моей переменной.

enter image description here

У меня также есть тест Сантьягорешение типа

$objectId = ($xmlDataRepo | Where-Object { $_.value.path -eq "/$filename" }).value.objectId
write-host "---$objectId"

Но это также дает мне четыре элемента вместо одного.

enter image description here

Ответы [ 3 ]

0 голосов
/ 28 мая 2018

Попробуйте это:

$xmlDataRepo | ForEach-Object {
  if ($_.value.path -eq "/$filename") {
    $oId = $_.value.objectId
  } else {
    $oId = "0000000000000000000000000000000000000000"
  }
} 
0 голосов
/ 29 мая 2018

Это работает для меня сейчас:

$xmlDataRepo.value | ForEach-Object {
    if ($_.path -eq "/file.txt")
    {
        $oldId = $_.commitId
        $changeType = "edi“
    }
}
0 голосов
/ 28 мая 2018

Вы можете использовать Where-Object вместо итерации.Смотри ниже.

$filename = "file.txt"
$objectId = ($xmlDataRepo | Where-Object { $_.value.path -eq "/$filename" }).value.objectId
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...