windows - Sådan hentes værdier fra xml ved hjælp af Powershell og XPath og baseret på værdisøgningen efter filerne, hvis de er til stede eller ej

Indlæg af Hanne Mølgaard Plasc

Problem




  Problem:
  Jeg har disse XML-data:



<?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>..........packagesEntityFramework.6.1.2lib
et45EntityFramework.dll</HintPath>
    </Reference>
    <Reference Include="EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..........packagesEntityFramework.6.1.2lib
et45EntityFramework.SqlServer.dll</HintPath>
    </Reference>
    <Reference Include="System" />
    <Reference Include="System.ComponentModel.DataAnnotations" />
  </ItemGroup>
</Project>



  Jeg skal skrive en funktion i Powershell, som kontrollerer om alle referencer i
  projekterne er gyldige (dvs. alle refererede samlinger findes, du kan
  se dem indenfor blok). Output begge: alle
  projekter med ugyldige referencer og de ugyldige stier til samlinger.



Hidtil har jeg prøvet dette:


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

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

$fianl
$fianl.length


Dette giver mig 'HintPath' -værdien, men jeg kan ikke få den tilsvarende 'Project' -værdi til at kontrollere, hvilket projekt HintPath er forkert, eller filen er ikke til stede.


Hjælp venligst!

Bedste reference


Fyldning af din XML i en variabel ...


[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:packagesEntityFramework.6.1.2lib
et45EntityFramework.dll</HintPath>
    </Reference>
    <Reference Include="EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>c:packagesEntityFramework.6.1.2lib
et45EntityFramework.SqlServer.dll</HintPath>
    </Reference>
    <Reference Include="System" />
    <Reference Include="System.ComponentModel.DataAnnotations" />
  </ItemGroup>
</Project>
'@


Jeg mene om hvert projektelement. For hvert projekt trækker jeg referencerne. Hvis jeg finder en ugyldig reference (stien ikke eksisterer), spytter jeg en besked, der siger ugyldig sti og noterer projektet:


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'))"
            }
        }
    }
}


Jeg er sikker på, at dette ikke er den information, du vil have. Tilgangen er lidt af det, jeg vil vise. Jeg bruger flere sløjfer. En til den første enhed, du er interesseret i: projekt. En anden til den anden: referenceveje. Forhåbentlig giver det mening.


Held og lykke,
EN-