2017-03-27 15 views
-2

最近Powershellを勉強していますので、どうぞご一緒にください。私はPowerShellを使用したマニフェスト以下のXML読みしようとしています:PowershellからXMLファイル/マニフェストを読む

 
$/TFS/Main/branch/Shrink.sql 
$/TFS/Main/branch/Users.sql 
$/TFS/Main/branch/Pre/Logins.sql 
$/TFS/Main/branch/Post/Security.sql 

君たちは、PowerShellスクリプトで私を助けることができる:私はこのような結果は

<manifest desc="sql manifest"> 
    <projects> 
    <project project_directory="$/TFS/Main/branch/"> 
     <files> 
     <file filename="Shrink.sql"/> 
     <file filename="Users.sql"/> 
     </files> 
    </project> 
    <project project_directory="$/TFS/Main/branch/Pre/"> 
     <files> 
     <file filename="Logins.sql"/> 
     </files> 
    </project> 
    <project project_directory="$/TFS/Main/branch/Post/"> 
     <files> 
     <file filename="Security.sql"/> 
     </files> 
    </project> 
    </projects> 
</manifest> 

を期待していますか?

$XmlDocument = Get-Content -Path "xmlfile.xml" 
+1

「PowerShellでXMLファイルをどのように解析するのですか? –

答えて

1

あなたは**の文字を削除した場合、次のコードは、XMLファイルと同じディレクトリからコマンドを実行していると仮定すると、あなたが望む結果を返す必要があります。望ましい場合

#### More than one directory 
$results = @() 

[xml]$XmlDocument = Get-Content .\xmlfile.xml 

$directoryCount = $XmlDocument.manifest.projects.project.Count 
$directoryNames = $XmlDocument.manifest.projects.project.project_directory 

for($i = 0 ; $i -lt $directoryCount; $i++) 
{ 
    $files = $XmlDocument.manifest.projects.project[$i].files.file 

    foreach($file in $files.filename) 
    { 
     $results += $directoryNames[$i] + $file 
    } 
} 

return $results 

#### Single Directory 
$results = @() 

[xml]$XmlDocument = Get-Content .\xmlfile.xml 

$directoryCount = @($XmlDocument.manifest.projects.project).Count 
$directoryNames = $XmlDocument.manifest.projects.project.project_directory 

for($i = 0 ; $i -lt $directoryCount; $i++) 
{ 
    $files = $XmlDocument.manifest.projects.project.files.file 

    foreach($file in $files.filename) 
    { 
     $results += $directoryNames + $file 
    } 
} 

return $results 

あなたはそれが$ trueにデフォルトになります-MultipleDirectoriesパラメータを指定しない場合

<# 
.Synopsis 
    Gets XML file to parse and displays results 
.DESCRIPTION 
    Reads content of an XML file, parses the 
    manifest.projects.project.project_directory 
    tag and displays concatenated results of 
    project.project_directory and child file.filename 
    items 
.EXAMPLE 
    \Get-XMLFileItems -XMLFilePath "C:\users\myusername\desktop\myxmlfile.xml" 
.EXAMPLE 
    .\Get-XMLFileItems -XMLFilePath "C:\users\myusername\desktop\myxmlfile.xml" -MultipleDirectories $False 
#> 

[cmdletBinding()] 
Param(
    [Parameter(Mandatory=$true)] 
    [ValidateScript({Test-Path $_})] 
    [string]$XMLFilePath, 

    [Parameter()] 
    [bool]$MultipleDirectories = $true 
) 

BEGIN 
{ 
    Function Load-XMLFile 
    { 
     try 
     { 
      Write-Output "Loading XML file...`n" 
      [xml]$XMLDocument = Get-Content $XMLFilePath 

      Get-XMLDirectoryInfo -File $XMLDocument 

     } 
     catch [Exception] 
     { 
      Write-Error -Message "Error loading XML file $XMLFilePath" 
     } 
    } 

    Function Get-XMLDirectoryInfo($File) 
    { 
     try 
     { 
      $directoryCount = @($File.manifest.projects.project).Count 
     } 
     catch [Exception] 
     { 
      Write-Error "Unable to count 'manifest.projects.project' in schema" 
     } 

     try 
     { 
      $directoryNames = $File.manifest.projects.project.project_directory 
     } 
     catch [Exception] 
     { 
      Write-Error "Unable to find names for items in 'manifest.projects.project.project_directory' in schema" 
     } 

     Get-FilesInXMLSchema -File $File 
    } 

    Function Get-FilesInXMLSchema($File) 
    { 
     for($i = 0 ; $i -lt $directoryCount; $i++) 
     { 
      if($MultipleDirectories -eq $true) 
      { 
       $files = $File.manifest.projects.project[$i].files.file 

       foreach($item in $files.filename) 
       { 
        [array]$results += $directoryNames[$i] + $item 
       } 
      } 

      else 
      { 
       $files = $XmlDocument.manifest.projects.project.files.file 

       foreach($item in $files.filename) 
       { 
        [array]$results += $directoryNames + $item 
       } 
      } 
     } 

     Show-Results -InputObject $results 
    } 

    Function Show-Results($InputObject) 
    { 
     try 
     { 
      return $InputObject 
     } 
     catch [Exception] 
     { 
      Write-Error -Message "Error displaying results" 
     } 
    } 

    Function Write-Error($Message) 
    { 
     Write-Output $Message 
     $Error[0] 
     Write-Output "Exiting script" 
     Exit 
    } 
} 

PROCESS 
{ 
    Load-XMLFile 
} 

END 
{} 

:、あなたはいくつかのコードの重複を排除し、再利用可能なスクリプトを作成するための関数にこれを入れることができます。使い方の冒頭でヘルプコメントを確認してください。私はあなたのXMLの両方の例に対してこれをテストしています。お役に立てれば!

+0

ディレクトリに複数のカウントがある場合は、この作業を完璧にありがとうございます。 <マニフェストDESC = "SQLマニフェスト"> <プロジェクトproject_directory = "$/TFSは、/メイン/支店/"> <ファイル名= "シュリンク:それは1つのディレクトリだけのために働いているように見えるしません。 .SQL "/> 任意の提案ですか? –

+0

Robin、両方のシナリオへのアプローチと、同じXMLスキーマを持つファイルに対して再利用できる高度な機能を使用したスクリプトを含めるように私の応答を更新しました。ご質問がある場合はお知らせください。 – trebleCode

+0

ありがとうございました。user2734259これは機能します。私は関数を作成し、メインのスクリプトにこれを呼び出させます。 –