Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

gelöst XML-Datei mit Powershell editieren, 2. Teil

Mitglied: Jensxx1975

Jensxx1975 (Level 1) - Jetzt verbinden

02.11.2018, aktualisiert 11:04 Uhr, 656 Aufrufe, 13 Kommentare, 1 Danke

Hallo zusammen,

habe hier aus dem Form eine Script-Zeile erhalten um ein XML-File zu editieren.

01.
# Variable definieren
02.
    $prefix = "Bogen_"
03.

04.
    # Zählervariable erstellen
05.
    $cnt = 0
06.

07.
    $xml.SelectNodes('//default:Component[@SignatureName]',$ns) | %{$_.Component.SheetName = "$prefix$($cnt.toString().padleft(2,'0'))"; $cnt++} 
Läuft wunderbar.

Nun möchte ich bestimmte Werte des Attributs „SheetName“ nicht ändern sondern überspringen.

Mein Versuch:

01.
$xml.SelectNodes('//default:Component[@SignatureName]',$ns) | if ($_.Component.SheetName -eq "Bg_0") {$_.Component.SheetName = "Bg_0"} else | %{$_.Component.SheetName = "$prefix$($cnt.toString().padleft(2,'0'))"; $cnt++}
Wirft leider eine Fehlermeldung:
if : Die Benennung "if" wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausführbaren Programms erkannt. Überprüfen Sie die Schreibweise des Namens, oder ob der Pfad korrekt ist (sofern enthalten), und wiederholen Sie den
Vorgang.

Hat jemand einen Tipp für mich?

Urspungs-Frage: https://www.administrator.de/forum/xml-datein-script-editieren-390503.ht ...

Besten Dank vorab!


Gruß JENS
Mitglied: H41mSh1C0R
02.11.2018 um 13:22 Uhr
Hi Jens,

dein Piping Konstrukt wird so nix.

Du kannst Nodes Selektieren und dann nach der Pipe z.B. mit ForEach oder andere Schreibweise "% { }" für jede einzelne Node weitermachen.

VG
Bitte warten ..
Mitglied: Jensxx1975
02.11.2018 um 14:52 Uhr
Hallo!

Danke für Deine Antwort, aber ich stehe noch ziemlich auf dem Schlauch.

Ich habe das jetzt so umgestellt. (Ist noch nicht die endgültige Lösung, da ich eigentlich erreichen möchte das ein bestimmer Wert überhaupt nicht angefasst wird, aber ich will das besser verstehen)
01.
    # Variable definieren
02.
    $prefix = "Bogen_"
03.

04.
    # Zählervariable erstellen
05.
    $cnt = 0
06.
    
07.
    $xml.SelectNodes('//default:Component[@SignatureName]',$ns) | %{$_.Component.SheetName = "$prefix$($cnt.toString().padleft(2,'0'))"; $cnt++}
08.
    $xml.SelectNodes('//default:Component[@SignatureName]',$ns) | %{$_.Component.SheetName = "Bogen_00" -replace "Bogen_00", "Umschlag"}


Die Zeile sorgt dafür das die Werte des Attributs "SheetName" in "Bogen_00....99" gewandelt werden:
01.
$xml.SelectNodes('//default:Component[@SignatureName]',$ns) | %{$_.Component.SheetName = "$prefix$($cnt.toString().padleft(2,'0'))"; $cnt++}


...und diese Zeile sollte doch den Wert "Bogen_00" mit "Umschlag" ersetzen.
01.
    $xml.SelectNodes('//default:Component[@SignatureName]',$ns) | %{$_.Component.SheetName = "Bogen_00" -replace "Bogen_00", "Umschlag"}
Es werden aber ALLE Attribute in "Umschlag" geändert. Irgdenwie logisch, wegen %.
Aber wenn ich mit If arbeite gibt's wieder ne Fehlermeldung.

01.
$xml.SelectNodes('//default:Component[@SignatureName]',$ns) | if ($_.Component.SheetName = "Bogen_00") {$_.Component.SheetName -replace "Bogen_00", "Umschlag"}

Danke!

Gruß JENS
Bitte warten ..
Mitglied: H41mSh1C0R
LÖSUNG 02.11.2018 um 16:13 Uhr
Mal ein einfaches Beispiel:

Test.xml:

01.
<?xml version="1.0" encoding="utf-8"?>
02.
<Eintraege>
03.
<SheetName>
04.
    Test1
05.
</SheetName>
06.
<SheetName>
07.
    Umschlag
08.
</SheetName>
09.
<SheetName>
10.
    Test2
11.
</SheetName>
12.
</Eintraege>
01.
[XML]$Inhalt = get-content "C:\Temp\Test.xml"
02.
$Inhalt.SelectNodes(//Eintraege/SheetName)
03.

04.
$Count = 0
05.

06.
$Inhalt.Eintraege.SheetName | %{
07.

08.
if($_ -match "Umschlag"){
09.
 # wenn der SheetName "Umschlag" lautet passiert nichts
10.
}else{
11.
 $_ = "Bogen" + $Count++
12.
}
13.
}

Ausgabe vorher, wenn du dir die Nodes ausgeben lässt:

Test1
Umschlag
Test2


Ausgabe nachher, wenn du dir die Nodes ausgeben lässt:

Bogen0
Umschlag
Bogen1

VG
Bitte warten ..
Mitglied: 137443
LÖSUNG 02.11.2018, aktualisiert um 19:44 Uhr
01.
$xml.SelectNodes('//default:Component[@SignatureName]',$ns) | %{
02.
    If ($_.Component.SheetName -ne "Bg_0"){
03.
        $_.Component.SheetName = "$prefix$($cnt.toString().padleft(2,'0'))"
04.
        $cnt++
05.
    }
06.
}
Usw. ...
Bitte warten ..
Mitglied: Jensxx1975
05.11.2018 um 11:51 Uhr
Danke!

Jetzt jetzt stehe ich vor dem nächsten Problem:

Den Knoten Media gibt es 2x, auf der gleichen Ebene im XML (war mir vorher garnicht aufgefallen). D.h. der Counter zählt knotenübergreifend durch.

01.
<Media Class="Consumable" HDM:RAWMEDIA="false" ID="r_181025_133021368_004167" MediaType="Paper" PartIDKeys="SignatureName SheetName" PartUsage="Implicit" Status="Unavailable">
02.
      <Media SignatureName="SIG001">
03.
        <Media Brand="Maxisatin" DescriptiveName="Maxisatin" Dimension="2494.48818898 1785.82677165" Grade="2" GrainDirection="ShortEdge" HDM:RawDimension="2494.48818898 1785.82677165" ProductID="103-200-088063-01-5U" SheetName="Bg_0" Thickness="200" Weight="200" />
04.
      </Media>
05.
      <Media SignatureName="SIG002">
06.
        <Media Brand="Maxisatin" DescriptiveName="Maxisatin" Dimension="2494.48818898 1785.82677165" Grade="2" GrainDirection="ShortEdge" HDM:RawDimension="2494.48818898 1785.82677165" ProductID="R10-100-088-7" SheetName="Bogen_01" Thickness="100" Weight="100" />
07.
      </Media>
08.
      <Media SignatureName="SIG003">
09.
        <Media Brand="Maxisatin" DescriptiveName="Maxisatin" Dimension="2494.48818898 1785.82677165" Grade="2" GrainDirection="ShortEdge" HDM:RawDimension="2494.48818898 1785.82677165" ProductID="R10-100-088-7" SheetName="Bogen_02" Thickness="100" Weight="100" />
10.
      </Media>
11.
      <Media SignatureName="SIG004">
12.
        <Media Brand="Maxisatin" DescriptiveName="Maxisatin" Dimension="2494.48818898 1785.82677165" Grade="2" GrainDirection="ShortEdge" HDM:RawDimension="2494.48818898 1785.82677165" ProductID="R10-100-088-7" SheetName="Bogen_03" Thickness="100" Weight="100" />
13.
      </Media>
14.
      <Media SignatureName="SIG005">
15.
        <Media Brand="Maxisatin" DescriptiveName="Maxisatin" Dimension="2494.48818898 1785.82677165" Grade="2" GrainDirection="ShortEdge" HDM:RawDimension="2494.48818898 1785.82677165" ProductID="R10-100-088-7" SheetName="Bogen_04" Thickness="100" Weight="100" />
16.
      </Media>
17.
      <Media SignatureName="SIG006">
18.
        <Media Brand="Maxisatin" DescriptiveName="Maxisatin" Dimension="2494.48818898 1785.82677165" Grade="2" GrainDirection="ShortEdge" HDM:RawDimension="2494.48818898 1785.82677165" ProductID="R10-100-088-7" SheetName="Bogen_05" Thickness="100" Weight="100" />
19.
      </Media>
20.
      <Media SignatureName="SIG007">
21.
        <Media Brand="Tauro-Offset" DescriptiveName="Tauro-Offset" Dimension="2494.48818898 1785.82677165" GrainDirection="ShortEdge" HDM:RawDimension="2494.48818898 1785.82677165" ProductID="400-170-088063-01-6G" SheetName="Bogen_06" Thickness="0" Weight="170" />
22.
      </Media>
23.
    </Media>
24.
    <Media Class="Consumable" ID="r_181025_133021368_004168" MediaType="Plate" PartIDKeys="SignatureName SheetName" PartUsage="Implicit" Status="Unavailable">
25.
      <Media SignatureName="SIG001">
26.
        <Media Dimension="2990.5511811 2298.8976378" SheetName="Bg_0" />
27.
      </Media>
28.
      <Media SignatureName="SIG002">
29.
        <Media Dimension="2990.5511811 2298.8976378" SheetName="Bogen_07" />
30.
      </Media>
31.
      <Media SignatureName="SIG003">
32.
        <Media Dimension="2990.5511811 2298.8976378" SheetName="Bogen_08" />
33.
      </Media>
34.
      <Media SignatureName="SIG004">
35.
        <Media Dimension="2990.5511811 2298.8976378" SheetName="Bogen_09" />
36.
      </Media>
37.
      <Media SignatureName="SIG005">
38.
        <Media Dimension="2990.5511811 2298.8976378" SheetName="Bogen_10" />
39.
      </Media>
40.
      <Media SignatureName="SIG006">
41.
        <Media Dimension="2990.5511811 2298.8976378" SheetName="Bogen_11" />
42.
      </Media>
43.
      <Media SignatureName="SIG007">
44.
        <Media Dimension="2990.5511811 2298.8976378" SheetName="Bogen_12" />
45.
      </Media>
46.
    </Media>
Ich müsste also im Konten
Media noch zusätzlich nach einem Attribut+Wert suchen.

So geht's leider nicht

01.
    $cnt = 1
02.

03.
    $xml.SelectNodes('//default:Media@MediaType="Paper"[@SignatureName]',$ns) | %{
04.
    If ($_.Media.SheetName -ne "Bg_0"){
05.
        $_.Media.SheetName = "$prefix$($cnt.toString().padleft(2,'0'))"
06.
        $cnt++}}
07.

08.
    $cnt = 1
09.

10.
    $xml.SelectNodes('//default:Media@MediaType="Plate"[@SignatureName]',$ns) | %{
11.
    If ($_.Media.SheetName -ne "Bg_0"){
12.
        $_.Media.SheetName = "$prefix$($cnt.toString().padleft(2,'0'))"
13.
        $cnt++}}
Danke!

Gruß JENS
Bitte warten ..
Mitglied: 137443
05.11.2018, aktualisiert um 12:21 Uhr
Zitat von Jensxx1975:

Danke!
Stichwort xPath, das Tutorial dazu hatte ich dir gepostet. Lesen scheint nicht deine Stärke.
Jetzt jetzt stehe ich vor dem nächsten Problem:
Neue Frage neuer Thread, ist das so schwer?

P.s. Wie wärs erst mal mit mal Grundlagen aneignen? Dann musst du nicht jeden Furz erfragen.
Bitte warten ..
Mitglied: Jensxx1975
05.11.2018 um 15:39 Uhr
Das Tutorial hatte ich gelesen, aber leider nicht die passende Antwort extrahieren können bzw. das was ich für die Lösung halte funktioniert nicht.

01.
$xml.SelectNodes('//default:Media[attribute::MediaType = "Paper"][@SignatureName]',$ns)
Bzgl. Grundlagen gebe ich Dir recht. Die habe ich aber zurzeit noch nicht in ausreichendem Maße, doch leider dieses kleine Projekt vor der Brust.

Naja, muss ich durch.

Trotzdem Dank bis hierhin...


Gruß JENS
Bitte warten ..
Mitglied: 137443
LÖSUNG 05.11.2018, aktualisiert um 15:44 Uhr
$xml.SelectNodes("//default:Media[@MediaType = 'Paper']",$ns)
siehe:
https://www.w3schools.com/xml/xpath_syntax.asp
//title[@lang='en'] Selects all the title elements that have a "lang" attribute with a value of "en"
Bitte warten ..
Mitglied: Jensxx1975
05.11.2018 um 16:25 Uhr
...ist das
01.
    $xml.SelectNodes("//default:Media[@MediaType = 'Plate']",$ns)
zusätzlich oder ersetzend
01.
$xml.SelectNodes('//default:Media[@SignatureName]',$ns)
?
Bitte warten ..
Mitglied: 137443
LÖSUNG 05.11.2018 um 16:25 Uhr
Soweit solltest du selbst denken können.
Bitte warten ..
Mitglied: Jensxx1975
05.11.2018 um 16:43 Uhr


Es ist ja nicht so, dass ich nicht beide Varianten getestet hätte. Leider ohne passendes Ergebnis.



Naja, mache erstmal was anderes - vielleicht habe ich ja morgen die Erleuchtung.
Bitte warten ..
Mitglied: Jensxx1975
06.11.2018 um 14:05 Uhr
So, die Erleuchtung ist leider ausgelieben, aber so funktioniert es
01.

02.
    $cnt = 1
03.

04.
    $xml.SelectNodes("//default:Media[@MediaType = 'Paper']/default:Media[@SignatureName]",$ns) | %{
05.
    If ($_.SheetName -ne "Bg_0"){
06.
        $_.SheetName = "$prefix$($cnt.toString().padleft(2,'0'))"
07.
        $cnt++}}
08.

09.
    $cnt = 1
10.

11.
    $xml.SelectNodes("//default:Media[@MediaType = 'Plate']/default:Media[@SignatureName]",$ns) | %{
12.
    If ($_.SheetName -ne "Bg_0"){
13.
        $_.SheetName = "$prefix$($cnt.toString().padleft(2,'0'))"
14.
        $cnt++}}
15.
Zumindest mit meinem Test-XML.

Leider erhalte ich trotzdem eine Fehlermeldung:
Ausnahme beim Festlegen von "SheetName": "Die Eigenschaft "SheetName" wurde für dieses Objekt nicht gefunden.
jeweils für diese Zeile:
01.
 $_.SheetName = "$prefix$($cnt.toString().padleft(2,'0'))"
Bitte warten ..
Mitglied: Jensxx1975
06.11.2018 um 14:36 Uhr
So:

01.
    $xml.SelectNodes("//default:Media[@MediaType = 'Plate']//default:Media[@SignatureName]",$ns) | %{
02.
    If ($_.Media.SheetName -ne "Bg_0"){
03.
        $_.Media.SheetName = "$prefix$($cnt.toString().padleft(2,'0'))"
04.
        $cnt++}}
Keine Fehlermeldung mehr.

DANKE!

Gruß Jens
Bitte warten ..
Ähnliche Inhalte
XML

XML-Datei mit Powershell editieren, 3. Teil

gelöst Frage von Jensxx1975XML2 Kommentare

Hallo zusammen, ich brauche nochmal Hilfe. Geht um folgendes, das hier läuft: XML-Teil: das aber nicht: XML-Teil: Ich erkenne ...

XML

XML-Datei mit Powershell editieren, 4. Teil

Frage von Jensxx1975XML1 Kommentar

Hallo nochmal, was kann ich denn in diesem Fall tun? Mit allem was ich bisher über X-Path gelernt habe ...

XML

XML Datei mit Powershell splitten

gelöst Frage von LianenSchwingerXML2 Kommentare

Hallo, ich habe eine riesige Exportdatei im XML-Format die ich nicht weiterverarbeiten kann. Der Aufbau ist wie folgt: Ich ...

Batch & Shell

Powershell .xml Datei mit Zeitstempel öffnen

gelöst Frage von BaphometBatch & Shell1 Kommentar

Hallo liebe Community, nach leider erfolgloser Google-Suche richte ich mich an Euch um evtl. eine Lösung für mein Thema ...

Neue Wissensbeiträge
Administrator.de Feedback
Was als Noob hier mal gesagt werden musste
Information von th30ther vor 19 StundenAdministrator.de Feedback2 Kommentare

Moinsen wertes Forum, ich möchte mich an dieser Stelle mal beim Forum generell und bei aqui speziell bedanken! Ich ...

Windows 10
Windows 10 Mai 2019 Update (Version 1903) ist da
Information von kgborn vor 1 TagWindows 104 Kommentare

Nur ein kurzer Infosplitter: Microsoft hat die Nacht (21. Mai 2019) das Funktionsupdate auf Windows 10 Version 1903 freigegeben. ...

E-Mail

Newsletter: Unread News - IT News in Byte Länge

Tipp von franktaylor vor 1 TagE-Mail11 Kommentare

Hallo, würde gerne auf einen Newsletter hinweisen, den ich heute per Zufall gefunden und mit euch gerne teilen möchte: ...

Outlook & Mail

Outlook 2016 stürzt ab, wenn man ein (at)- Zeichen im Text einer neuen E-Mail schreibt

Tipp von Enriqe vor 2 TagenOutlook & Mail4 Kommentare

Bei uns in der Firma häuften sich die Fälle, bei denen sich Outlook kommentarlos verabschiedet, wenn man ein - ...

Heiß diskutierte Inhalte
Hyper-V
Novell virtualisieren
Frage von spoboeHyper-V20 Kommentare

Hallo zusammen, ich habe absolut keine Ahnung von Novell, aber wir haben hier ein ganz altes Schätzchen (vermutlich Novell ...

Windows Server
Ungewollte IP Änderung am DC sorgt für Probleme
Frage von thomas-99Windows Server19 Kommentare

Hallo Zusammen, wir haben ein kleines Netz mit 5 verschiedenen VMs (DC, AD, Fileserver, Exchange, TK Anlage - alle ...

Windows Netzwerk
Netzlaufwerk: einfache Liste der täglich gelöschten, geänderten+neuen Files
gelöst Frage von mylightWindows Netzwerk17 Kommentare

wir haben Windows Clients, das zentrale Teamlaufwerk liegt auf einem Netzwerkserver (ca. 100Gb, 10.000 Verzeichnisse, 180.000Dateien), auf die Konsole ...

Router & Routing
Anfängerfrage zum VLAN Routing
Frage von simbeaRouter & Routing16 Kommentare

Folgendes Setting soll umgesetzt werden: Um in meiner Praxis die Rechner von einer VOIP-Telefonanlage zu trennen wird ein Cisco ...