XML Parameter auslesen mit Batch oder Text ausgeben.

frodo1990

Newbie
Registriert
Feb. 2021
Beiträge
5
Hallo,

ich habe eine XML Datei und möchte dort einen Wert ausgeben lassen. Ich habe es mit einer Batch versucht. Leider sind sechs Parameter gleich und mit meiner Lösung wird nur das letzte ausgegeben.

Ich hätte gerne den 4. Wert ausgegeben. Also der Wert "198"

Das habe ich Versucht:

Code:
@echo off
set "xmlpath=Werte.xml"
for /f "delims=" %%a in ('powershell -Executionpolicy ByPass -command "([xml](gc '%xmlpath%')).SelectSingleNode('//Value').innerText"') do set "result=%%a"
echo Wert: %result%

pause

Hier ist die XML mit den sechs Werten:

Code:
 <AdjustWert>
      <AdjustWerte>
        <Key>S1_MEASURE</Key>
        <Value>-655</Value>
      </AdjustWerte>
      <AdjustWerte>
        <Key>S2_MEASURE</Key>
        <Value>0</Value>
      </AdjustWerte>
      <AdjustWerte>
        <Key>S3_MEASURE</Key>
        <Value>-1355</Value>
      </AdjustWerte>
      <AdjustWerte>
        <Key>S4_MEASURE</Key>
        <Value>198</Value>
      </AdjustWerte>
      <AdjustWerte>
        <Key>S5_MEASURE</Key>
        <Value>0</Value>
      </AdjustWerte>
      <AdjustWerte>
        <Key>S6_MEASURE</Key>
        <Value>-83</Value>
      </AdjustWerte>
    </AdjustWert>

Vielen Dank für die Hilfe

Gruß Frodo1990
 
Sehr einfach

powershell:
1612270417223.png



$ovf = New-Object System.XML.XMLDocument
$ovf.Load("c:\test\test.xml")
$ovf.AdjustWert.AdjustWerte.Value[3]
1612270459771.png

Ergänzung ()

ohne[] bekommst du dann alle "Value" aus.
$ovf ist eine variable.
https://www.windowspro.de/script/xml-powershell-elemente-attribute-auslesen-textknoten-anzeigen
 
  • Gefällt mir
Reaktionen: frodo1990
PowerShell:
$xmlpfad = "<Pfad zur xml>" # Pfad zu deiner XML
$muster = "S4_MEASURE" # der Wert nach dem gesucht wird, in deinem Fall die 4. Messung (<Key>)
$xpath = "/AdjustWert/AdjustWerte"

[xml]$xml = Get-Content $xmlpfad # Einlesen der xml

# suchen nach deinem Muster und Ausgabe des Wertes (<Value>) davon
$x = Select-Xml -xml $xml -XPath $xpath | select -ExpandProperty node | Where-Object {$_.Key -eq $muster} 

$val = $x.Value # Wert speichern

Versuchs mal hiermit, $val enthält dann dein Ergebnis.
 
Zuletzt bearbeitet:
sikarr schrieb:
PowerShell:
$xmlpfad = "<Pfad zur xml>" # Pfad zu deiner XML
$muster = "S4_MEASURE" # der Wert nach dem gesucht wird, in deinem Fall die 4. Messung (<Key>)
$xpath = "/AdjustWert/AdjustWerte"

[xml]$xml = Get-Content $xmlpfad # Einlesen der xml

# suchen nach deinem Muster und Ausgabe des Wertes (<Value>) davon
$x = Select-Xml -xml $xml -XPath $xpath | select -ExpandProperty node | Where-Object {$_.Key -eq $muster}

$val = $x.Value # Wert speichern

Versuchs mal hiermit, $val enthält dann dein Ergebnis.
Morgen,

habe es damit versucht. Habe eine Batch die das Powershell startet, aber danach bekomme ich keinen Wert. Wo wird mir der Wert dann angezeigt? Kann ich es in eine Batch übergeben? Danke
Ergänzung ()

Vasdada schrieb:
Sehr einfach

powershell:
Anhang anzeigen 1035569


$ovf = New-Object System.XML.XMLDocument
$ovf.Load("c:\test\test.xml")
$ovf.AdjustWert.AdjustWerte.Value[3]
Anhang anzeigen 1035570
Ergänzung ()

ohne[] bekommst du dann alle "Value" aus.
$ovf ist eine variable.
https://www.windowspro.de/script/xml-powershell-elemente-attribute-auslesen-textknoten-anzeigen
Super Danke!

Es funktionert! Ich will den Powershell befehl mit einer Batch starten. Wie bekomme ich den ausgegebenen Wert wieder in die Batch zurück, damit dieser Angezeigt wird.

zb. Wert = 198

Danke

Viele Grüße Frodo1990
 
Zuletzt bearbeitet:
gebe dir nachher die Lösung:) sorry gerade arbeit
 
Zuletzt bearbeitet von einem Moderator:
  • Gefällt mir
Reaktionen: frodo1990
Nichts fuer ungut, aber warum ueberhaupt die Batch, wenn du eh nur direkt Powershell aufrufst?
Das mit der Executionpolicy kann man auch global machen, und das Script selbst signieren.
 
Ich habe es jetzt hinbekommen. Wert wird mir über die Batch angezeigt. Danke schon mal für alles.

Ein Problem hätte ich noch.
Der Pfad in dem die XML sitzt ändert sich immer, da der Ordner mit Datum Uhrzeit erstellt wird und dann ein generierter Unterordner. zb. "C:\Daten\20210203_090132_570\00000000614634AC\Test.XML" (Ordnername) .

Kann man diesen Pfad über die Batch oder dem Powershell eintragen oder weitergeben?

Danke

Viele Grüße
Frodo1990
 
Sorry, hab mich vielleicht falsch ausgedrückt. Ich nutze auf der Arbeit eine Software. Diese wertet Bilder aus und berechnet die einzelnen Abstände. Das sind die 6 Werte die ich zur Verfügung habe. Diese sind nach jedem Bild anders.

Die Software erstellt nach jedem Bild einen Ordner in Pfad: "C:\Daten\" und erstellt automatisch diese Unterordner mit der XML.

C:\Daten\20210203_090132_570\00000000614634AC\Test.XML"

Da ich im Powershell generierte Ordner nutze, kann ich den Pfad nicht eingeben zb. wie unten angegeben:

Code:
$ovf = New-Object System.XML.XMLDocument
$ovf.Load("C:\Daten\20210203_090132_570\00000000614634AC\Test.XML")
$ovf.AdjustWert.AdjustWerte.Value[3]

Kann ich also in meiner Batch sagen, sie soll den Pfad an Powershell weitergeben?
Dann könnte ich die Lösung hinbekommen.

Danke, ich hoffe ich konnte es jetzt besser erklären.

Gruß
Frodo1990
 
wie wäre es denn dann mit:

https://www.windowspro.de/script/datum-berechnen-formatieren-powershell-get-date (nur wenn static)

$datum = Get-Date -Format yyyy
$ovf = New-Object System.XML.XMLDocument
$ovf.Load("C:\Daten\$datum_090132_570\00000000614634AC\Test.XML")
$ovf.AdjustWert.AdjustWerte.Value[3]

für 090132_570 brauchst du dann halt noch eine variable. oder ähnlich wie bei sql mit % ich weis aber nun nicht wie der befehl in powershell heist.

oder mach es doch in einer schleife.... und iteriere alle durch.

https://it-learner.de/mit-der-windo...essen-unterverzeichnissen-komplett-auflisten/

https://social.technet.microsoft.co...ellungs-und-nderungsdatum?forum=powershell_de



so ich bin dann mal raus.
alles weitere kostet.
 
Wie startest du denn die Batch? Kannst du Parameter mitgeben?
Aber nochmal: Warum ueberhaupt Batch? Dieses doppelt gemoppelt wenn du eh hauptsaechlich Powershell verwendest macht es dir nicht einfacher.
Setzte deine ExecutionPolicy auf remotesigned, und du kannst lokale Scripte direkt ausfuehren.
 
frodo1990 schrieb:
Wo wird mir der Wert dann angezeigt? Kann ich es in eine Batch übergeben? Danke
Den Wert kannst du mit $val abrufen, stand aber oben schon. z.b. mit "RETURN $VAL"

Wenn du jetzt mehrere XMLs auswerten willst ist das relativ einfach, je nach dem wie Fit du in PS bist.

Hat es einen Grund das du das Powershell Script nicht direkt aufrufen möchtest?

PowerShell:
$xmlpfad = "<Pfad zu den XMLs>" # Oberster Orderpfad zu den XML
$muster = "S4_MEASURE" # der Wert nach dem gesucht wird, in deinem Fall die 4. Messung (<Key>)
$xpath = "/AdjustWert/AdjustWerte"

# suchen jeder XML in $xmlpfad
$xmls = get-childitem $xmlpfad -recurse | where-object {$_.extension -match ".xml"}

# erstellen leeres Array für Werte
[array]$xmlarray = @()

# auswerten jeder xml in $xmls
foreach ($xml in $xmls){
   
    # Einlesen der xml
    [xml]$xmldatei = Get-Content $xml.fullname

    # suchen nach deinem Muster und Ausgabe des Wertes (<Value>) davon
    $x = Select-Xml -xml $xmldatei -XPath $xpath | select -ExpandProperty node | Where-Object {$_.Key -eq $muster}
   
    # Hinzufügen der Werte in ARRAY nach Dateiname, Suchmuster und Wert
    $xmlarray += @([PSCUSTOMOBJECT]@{DATEINAME = $xml.name ; SUCHMUSTER = $muster ; WERT = $x.Value }) # Wert speichern
   
}

# konvertierung in CSV und Ausgabe
RETURN $xmlarray | ConvertTo-Csv -Delimiter ";" -NoTypeInformation
man könnte jetzt die Daten in was auch immer hier ausgeben, musst du wissen.
 
Zuletzt bearbeitet:
Zurück
Oben