Как извлечь значения из XML с помощью Powershell и XPath и на основе поиска значений для файлов, если они есть или нет - PullRequest
0 голосов
/ 18 мая 2018

Проблема: у меня есть эти данные XML:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
  <ItemGroup>
    <Reference Include="EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\..\..\..\..\packages\EntityFramework.6.1.2\lib\net45\EntityFramework.dll</HintPath>
    </Reference>
    <Reference Include="EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\..\..\..\..\packages\EntityFramework.6.1.2\lib\net45\EntityFramework.SqlServer.dll</HintPath>
    </Reference>
    <Reference Include="System" />
    <Reference Include="System.ComponentModel.DataAnnotations" />
  </ItemGroup>
</Project>

Мне нужно написать функцию в Powershell, которая проверяет, все ли ссылки в проектах действительны (т.е.все ссылочные сборки существуют, их можно увидеть внутри блока).Выведите оба: все проекты с недопустимыми ссылками и недопустимыми путями к сборкам.

Пока я пробовал это:

[xml]$results = Get-Content path-to-file/MigratorConsole.csproj

$fianl += $results.Project.ItemGroup.Reference | %{$_.HintPath} | select-object -unique

$fianl
$fianl.length

Это дает мне значение "HintPath"но я не могу получить соответствующее значение "Project", чтобы проверить, для какого проекта указан неправильный HintPath или отсутствует файл.

Пожалуйста, помогите!

1 Ответ

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

Заполнение вашего XML в переменную ...

[xml]$foo = @'
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
  <ItemGroup>
    <Reference Include="EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>c:\packages\EntityFramework.6.1.2\lib\net45\EntityFramework.dll</HintPath>
    </Reference>
    <Reference Include="EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>c:\packages\EntityFramework.6.1.2\lib\net45\EntityFramework.SqlServer.dll</HintPath>
    </Reference>
    <Reference Include="System" />
    <Reference Include="System.ComponentModel.DataAnnotations" />
  </ItemGroup>
</Project>
'@

Я перебираю каждый элемент проекта.Для каждого проекта я тяну ссылки.Если я нахожу недопустимую ссылку (путь не существует), я получаю сообщение о неверном пути и отмечаю проект:

foreach ($project in $foo.project) {
    foreach ($reference in $project.ItemGroup.Reference) {
        if ([string]::IsNullOrEmpty($reference.HintPath) -eq $false) {
            if ( $(Test-Path -Path $reference.HintPath) -eq $false ) {
                Write-Output "Bad Path in $(${project}.Import.GetAttribute('Project'))"
            }
        }
    }
}

Я уверен, что это не та информация, которая вам нужна.Подход вроде того, что я хочу показать.Я использую несколько петель.Один для первого лица, которое вам небезразлично: проект.Другое для второго: эталонные пути.Надеюсь, это имеет смысл.

Удачи, A-

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