PowerShell-Skript, um Werte aus n xml-Dateien in einer txt-Datei zu sammeln
Beziehe mich auf den Beitrag
Batch Script, um Variable in allen .xml-Dateien eines Ordners zu ändern
Dazu eine Anschlußfrage:
Es gibt n xml-Dateien in einem Verzeichnis und der Wert einer ihrer Variablen soll in eine txt-Datei geschrieben werden, so daß die txt-Datei n Zeilen enthält, Bsp.:
- xml-Datei_1: Variable/Wert_1: <E K="Image_City" V="Potsdam" />
…
- xml-Datei_n: Variable/Wert_n: <E K="Image_City" V="Hamburg" />
Das Script soll in jeder xml-Datei "Image_City" suchen und dessen Wert in eine txt-Datei eintragen. Potsdam und Hamburg wären dann die erste und die letzte Zeile in der txt-Datei. Gesucht wird das angepaßte PowerShell-Skript aus o.g. Beitrag an die neue Fragestellung.
LG
Batch Script, um Variable in allen .xml-Dateien eines Ordners zu ändern
Dazu eine Anschlußfrage:
Es gibt n xml-Dateien in einem Verzeichnis und der Wert einer ihrer Variablen soll in eine txt-Datei geschrieben werden, so daß die txt-Datei n Zeilen enthält, Bsp.:
- xml-Datei_1: Variable/Wert_1: <E K="Image_City" V="Potsdam" />
…
- xml-Datei_n: Variable/Wert_n: <E K="Image_City" V="Hamburg" />
Das Script soll in jeder xml-Datei "Image_City" suchen und dessen Wert in eine txt-Datei eintragen. Potsdam und Hamburg wären dann die erste und die letzte Zeile in der txt-Datei. Gesucht wird das angepaßte PowerShell-Skript aus o.g. Beitrag an die neue Fragestellung.
LG
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 31561615143
Url: https://administrator.de/contentid/31561615143
Ausgedruckt am: 03.12.2024 um 18:12 Uhr
9 Kommentare
Neuester Kommentar
N'Abend brooklin.
Wenn nur die reinen Werte aus den Files interessieren und die Files alle in einem Ordner liegen ist das mit einem Einzeiler erledigt
Falls die Files in Unterordner verteilt sind, "rekursiv" dann stattdessen
tio.run
Ansonsten halt ausführlich nach dem Schema des oben verlinkten Skriptes
It's your choice 😉🖖.
Gruß wrk
Wenn nur die reinen Werte aus den Files interessieren und die Files alle in einem Ordner liegen ist das mit einem Einzeiler erledigt
(Select-XML -Path "E:\Daten\*.xml" -XPath "//E[@K='Image_City']/@V").Node.Value | Set-Content -LiteralPath "e:\daten\werte.txt"
(Select-XML -LiteralPath (Get-ChildItem "E:\Daten" -Recurse -File -Filter *.xml).Fullname -XPath "//E[@K='Image_City']/@V").Node.Value | Set-Content -LiteralPath "e:\daten\werte.txt"
Ansonsten halt ausführlich nach dem Schema des oben verlinkten Skriptes
$folder = "e:\daten"
$txtfile = "e:\daten\werte.txt"
$xmlfiles = Get-ChildItem -LiteralPath $folder -Recurse -File -Filter *.xml
foreach($file in $xmlfiles){
$xml = New-Object XML
$xml.Load($file.Fullname)
$node = $xml.SelectSingleNode("//E[@K='Image_City']/@V")
If ($node){
Add-Content -LiteralPath $txtfile -Value $node.Value
}else{
Write-Warning "Image_City value node not found in file '$($file.Fullname)'!"
Add-Content -LiteralPath $txtfile -Value ""
}
}
Gruß wrk
Zitat von @brooklin:
...so ist jetzt das korrekte Aussehen der Variablen, die beim Auslesen nicht erkannt werden (vermutl. wg. der Pipes):
...so ist jetzt das korrekte Aussehen der Variablen, die beim Auslesen nicht erkannt werden (vermutl. wg. der Pipes):
<E K="Content_SupplementalCategories" V="1936||0" />
ODER
<E K="Content_SupplementalCategories" V="1936||0,1937||1,2010||2" />
Nein, die Pipes interessieren nicht, was im String steht interessiert nicht ... Guckst du die Demo:
https://tio.run/##tZDNqsIwEEbX5imGbHoVm7QVFKHVgrjyhwtCEUSk6KiF2JR26nWRd6 ...
Frage:
- wäre es machbar, für beide Skripte (Ein- und Auslesen) die (mehrfachen) txt einzusparen und aus der xml gleich eine csv zu erzeugen?
Klar kein Thema ...- wäre es machbar, für beide Skripte (Ein- und Auslesen) die (mehrfachen) txt einzusparen und aus der xml gleich eine csv zu erzeugen?
# zu verarbeitender ordner
$folder = "A:\brooklin"
# Ausgabedatei (CSV)
$csvoutput = "A:\brooklin\werte.csv"
# Array der Variablen
$variables = 'var_1s','var_2','var_3,'var_4'
# --------------------------------
# stoppe bei Fehler
$ErrorActionPreference = 'Stop'
# Dateien holen
$xmlfiles = Get-ChildItem -LiteralPath $folder -Recurse -File -Filter *.xml
# Dateien verarbeiten
$result = foreach($file in $xmlfiles){
# XML einlesen
$xml = New-Object XML
$xml.Load($file.Fullname)
# Ausgabe Hashtable erstellen
$data = [ordered]@{Filename=$file.Name}
# Variablen durchlaufen
foreach($var in $variables){
# Knoten suchen
$node = $xml.SelectSingleNode("//AL/E[@K='$var']/@V")
# Fallunterscheidung Knoten existiert nicht, ist leer oder hat Daten
if (!$node){
write-warning "Variable '$var' in '$($file.FullName)' nicht gefunden!"
$data.$var = "missing activity"
}elseif($node.Value -eq ""){
write-warning "Variable '$var' in '$($file.FullName)' enthält keine Daten!"
$data.$var = "no data"
}else{
$data.$var = $node.Value
}
}
# custom object aus der Hashtable erstellen
[pscustomobject]$data
}
# Ergebnisse in CSV-Datei ausgeben
if ($result){
$result | Export-CSV -LiteralPath $csvoutput -Delimiter ";" -NoTypeInformation -Encoding UTF8 -Force
}
Gruß wrk