Jak przekonwertować powtarzające się węzły xml na ciąg rozdzielany przecinkami za pomocą powershell

Mam około 13000 plików dziennika sformatowanych w formacie XML i muszę je przekonwertować na arkusz CSV.

Jak zobaczysz, nie jestem programistą, ale próbowałem.
Napisałem skrypt powershell, aby wyprowadzić pierwsze węzły i utworzyć ciąg rozdzielany przecinkami, ale utknąłem z uzyskaniem ostatniego węzła, który może zawierać wszystko, od żadnych wpisów do dziesiątek.

przykład pliku xml:

<?xml version="1.0" encoding="utf-8"?>
<MigrationUserStatus>
  <User>[email protected]</User>
  <StoreList>
    <EmailMigrationStatus>
      <MigrationStatus value="Success" />
      <FolderList>
        <TotalCount value="6" />
        <SuccessCount value="3" />
        <FailCount value="3" />
        <FailedMessages>
          <ErrorMessage>GDSTATUS_BAD_REQUEST:Permanent failure: BadAttachment</ErrorMessage>
          <SentTime>1601-01-01T00:00:00.000Z</SentTime>
          <ReceiveTime>1601-01-01T00:00:00.000Z</ReceiveTime>
        </FailedMessages>
        <FailedMessages>
          <ErrorMessage>GDSTATUS_BAD_REQUEST:Permanent failure: BadAttachment</ErrorMessage>
          <SentTime>1601-01-01T00:00:00.000Z</SentTime>
          <ReceiveTime>1601-01-01T00:00:00.000Z</ReceiveTime>
        </FailedMessages>
        <FailedMessages>
          <MessageSubject>Hey</MessageSubject>
          <ErrorMessage>GDSTATUS_BAD_REQUEST:Permanent failure: BadAttachment</ErrorMessage>
          <SentTime>2013-01-07T02:51:17.000Z</SentTime>
          <ReceiveTime>2013-01-07T02:51:17.000Z</ReceiveTime>
          <MessageSize value="2881" />
        </FailedMessages>
        <StartTime>2013-01-07T01:52:46.000Z</StartTime>
        <EndTime>2013-01-07T04:41:59.000Z</EndTime>
      </FolderList>
      <StartTime>2013-01-07T01:52:43.000Z</StartTime>
      <EndTime>2013-01-07T04:41:59.000Z</EndTime>
    </EmailMigrationStatus>
    <StartTime>2013-01-07T01:52:43.000Z</StartTime>
    <EndTime>2013-01-07T04:41:59.000Z</EndTime>
  </StoreList>
</MigrationUserStatus>

Dzięki temu kodowi mogę łatwo uzyskać pierwsze części utworzonej linii CSV:

$folder = "C:\temp"
$outfile = = [IO.File]::OpenWrite("alluserslogs.csv")
$csv = "User,Total Emails, Successful emails,Failed emails,Failures`r`n"

dir Status-*.log | foreach ( $_) {
[xml]$Status = Get-Content $_
$csvpt1 +=$Status.MigrationUserStatus.User + "," + $Status.MigrationUserStatus.StoreList.EmailMigrationStatus.FolderList.TotalCount.value + "," + $Status.MigrationUserStatus.StoreList.EmailMigrationStatus.FolderList.SuccessCount.value + "," + $Status.MigrationUserStatus.StoreList.EmailMigrationStatus.FolderList.FailCount.value

Następnym krokiem jest odejście. Chcę odczytać każdy węzeł FailedMessages i zbudować go na innym ciągu rozdzielanym przecinkami

foreach ($FMessage in $Status.MigrationUserStatus.StoreList.EmailMigrationStatus.FolderList.FailedMessages) {
$csvpt2 +=$FMessage + ","
}

Pożądane wyjście:

GDSTATUS_BAD_REQUEST:Permanent failu... 1601-01-01T00:00:00.000Z                1601-01-01T00:00:00.000Z,GDSTATUS_BAD_REQUEST:Permanent failu... 1601-01-01T00:00:00.000Z                1601-01-01T00:00:00.000Z,.......

Dostaję puste miejsce w $ FMessage lub wywołanie metody nie powiodło się z powodu + „,” na końcu, więc muszę to naprawić.

następnie połączę się w jeden ostatni ciąg i napiszę do pliku

$csv +=$csvpt1 + "," + $csvpt2
$outfile.WriteLine($csv)
}
$outfile.Close()

W dodanej liście życzeń wspaniale byłoby również móc utworzyć nagłówek kolumny pliku CSV Niepowodzenia dla n liczby kolumn, jak pokazano w największej liczbie węzłów FailedMessages.

Twoja pomoc jest bardzo mile widziana.

questionAnswers(1)

yourAnswerToTheQuestion