haberl92
Goto Top

Hilfe bei XML bearbeiten mit PowerShell

Hallo zusammen,

ich komme bei meinen Problem einfach nicht mehr weiter.

Ich muss in einer XML Datei die 10-stellige Nummer aus der Zeile 20 auslesen und dann die Zeilen 20 bis 22 mit dem Inhalt aus Zeile 20 neu abspeichern
<?xml version="1.0" encoding="ISO-8859-1"?>  
<!--created on 14.07.2023 12:26:47 SoftTracToAppl: 7.16.1 , ESStaBO: 3.0.3-->
<Batch ID="445462" Application="AZHSCAN@" Name="AZHscan_4_230714_700000_00484" xsi:noNamespaceSchemaLocation="file:c:\program files\SofttracToAppl\Batch.xsd" xmlns:tns="http://www.elsag-solutions.com/xmlDoc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">  
  <Attributes>
    <BatchName>AZHscan_4_230714_700000_00484</BatchName>
    <OutPath>\\cpdivaimg01-8.intra.vsa.de\nprod_scanner\</OutPath>
    <Date>2023-07-14</Date>
    <Time>12:26:47</Time>
    <Station>4</Station>
    <User>TEST</User>
    <UserBatchinput InputName="BOXNO">700000</UserBatchinput>  
    <IPath>/images/azh1_Prod/scan</IPath>
  </Attributes>
  <Documents>
    <Document ID="0">  
      <Pages>
        <Page ID="0">  
          <Front>
            <Attributes>
              <Barcode ID="5100" DataType="string">0139956605</Barcode>  
              <Barcode ID="5101" DataType="string">000001111118</Barcode>  
              <Paginator ID="9000">319540637936</Paginator>  
            </Attributes>
            <Images>
              <Image ID="0" Path="AZHscan_4_230714_700000_00484\00063793_0.jpg" Date="2023-07-14" Time="12:26:47" ImgType="3" DPI="200" Height="1662" Width="1181" Size="81557">  
              </Image>
              <Image ID="1" Path="AZHscan_4_230714_700000_00484\00063793_1.tif" Date="2023-07-14" Time="12:26:47" ImgType="2" DPI="200" Height="1662" Width="1181" Size="8117">  
              </Image>
            </Images>
          </Front>
          <Rear>
            <Attributes>
              <FormReco ID="57" FormType="FormBEB" Confidence="2.94">  
              </FormReco>
            </Attributes>
            <Images>
              <Image ID="2" Path="AZHscan_4_230714_700000_00484\00063793_2.jpg" Date="2023-07-14" Time="12:26:47" ImgType="3" DPI="200" Height="1663" Width="1186" Size="46215">  
              </Image>
              <Image ID="3" Path="AZHscan_4_230714_700000_00484\00063793_3.tif" Date="2023-07-14" Time="12:26:47" ImgType="2" DPI="200" Height="1663" Width="1186" Size="1688">  
              </Image>
            </Images>
          </Rear>
        </Page>
        <Page ID="1">  
          <Front>
            <Attributes>
              <Barcode ID="5100" DataType="string">0002222226</Barcode>  
              <Barcode ID="5101" DataType="string">319540637943</Barcode>  
              <Paginator ID="9000">319540637943</Paginator>  
            </Attributes>
            <Images>
              <Image ID="0" Path="AZHscan_4_230714_700000_00484\00063794_0.jpg" Date="2023-07-14" Time="12:26:47" ImgType="3" DPI="200" Height="828" Width="1147" Size="34992">  
              </Image>
              <Image ID="1" Path="AZHscan_4_230714_700000_00484\00063794_1.tif" Date="2023-07-14" Time="12:26:47" ImgType="2" DPI="200" Height="828" Width="1147" Size="3351">  
              </Image>
            </Images>

es handelt sich um die Zeilen:
<Barcode ID="5100" DataType="string">0139956605</Barcode>  
<Barcode ID="5101" DataType="string">000001111118</Barcode>  
<Paginator ID="9000">319540637936</Paginator>  

dies müssten so aussehen:
<Barcode ID="5000" DataType="string">000001111118</Barcode>  
<Barcode ID="5100" DataType="string">0139956605</Barcode>  
<Barcode ID="5101" DataType="string">000001111118</Barcode>  

Ich habe schon viele Möglichkeiten probiert, aber alles hat nichts gebracht.
Bin schon am verzweifeln, deshalb hätte ich auch schon ChatGPT gefragt, aber da kommt auch kein Ergebnis raus.

Bin um jede Hilfe dankbar

Content-Key: 7850120026

Url: https://administrator.de/contentid/7850120026

Printed on: April 28, 2024 at 15:04 o'clock

Member: Haberl92
Haberl92 Jul 14, 2023 at 15:19:34 (UTC)
Goto Top
das "zu weit eingerückte" bitte nicht beachten, war ein Copy-Fehler
Mitglied: 7426148943
7426148943 Jul 14, 2023 updated at 15:45:48 (UTC)
Goto Top
Ich muss in einer XML Datei die 10-stellige Nummer aus der Zeile 20 auslesen und dann die Zeilen 20 bis 22 mit dem Inhalt aus Zeile 20 neu abspeichern
Also nur die Nummer in den 3 Knoten gleich machen?? Dann:
$xml = New-Object XML
$xml.Load("D:\source.xml")    
$attributes = $xml.SelectSingleNode('/Batch/Documents/Document[@ID=0]/Pages/Page[@ID=0]/Front/Attributes')    
$attributes.Barcode[1].innerText = $attributes.Barcode[0].innerText
$attributes.Paginator.innerText = $attributes.Barcode[0].innerText
$xml.Save("D:\neu.xml")    
Das macht aus
<Barcode ID="5100" DataType="string">0139956605</Barcode>    
<Barcode ID="5101" DataType="string">000001111118</Barcode>    
<Paginator ID="9000">319540637936</Paginator>    
das
<Barcode ID="5100" DataType="string">0139956605</Barcode>    
<Barcode ID="5101" DataType="string">0139956605</Barcode>    
<Paginator ID="9000">0139956605</Paginator>    
das "zu weit eingerückte" bitte nicht beachten, war ein Copy-Fehler
Dann korrigiere es doch bitte das man hier weiß was Sache sein soll. darfst du auch am Freitag ...
Ein "Ist => Soll" sollte man doch hinbekommen !

Zeppel
Member: Haberl92
Haberl92 Jul 14, 2023 at 16:34:32 (UTC)
Goto Top
Hallo Zeppel,
vielen Dank für die schnelle Antwort.
aber das passt leider nicht ganz.

Das Ergebnis sollte so aussehen:
<Barcode ID="5000" DataType="string">000001111118</Barcode>    
<Barcode ID="5100" DataType="string">0139956605</Barcode>    
<Barcode ID="5101" DataType="string">000001111118</Barcode>   

Ist mir auch gerade noch aufgefallen, dass die ID dann auch geändert werden muss. Sorry

Die ID in Zeile 20 soll "5000" sein
In Zeile 21 "5100"
und in Zeile 22 "5101"

Die Zahlen "000001111118" sind fix. Die müssen immer in Zeile 20 und 22 sein.
Nur die 10-stellige Nummer sollte aus der Zeile 20 ausgelesen werden und in die Zeile 21 geschrieben werden
Mitglied: 7426148943
7426148943 Jul 14, 2023 updated at 16:48:43 (UTC)
Goto Top
Na dann
$xml = New-Object XML
$xml.Load("D:\source.xml")  
$attributes = $xml.SelectSingleNode('/Batch/Documents/Document[@ID=0]/Pages/Page[@ID=0]/Front/Attributes')  
$number = $attributes.Barcode[0].innerText
$attributes.Barcode[0].Id = "5000"  
$attributes.Barcode[0].innerText = "000001111118"  
$attributes.Barcode[1].Id = "5100"  
$attributes.Barcode[1].innerText = $number
[void]$attributes.RemoveChild($attributes.Paginator)
$newNode = $attributes.Barcode[1].CloneNode($false)
$newNode.Id = "5101"  
$newNode.innerText = "000001111118"  
$attributes.AppendChild($newNode)
$xml.Save("D:\neu.xml")  
Member: Haberl92
Haberl92 Jul 14, 2023 at 16:53:36 (UTC)
Goto Top
Zitat von @7426148943:

Na dann
$xml = New-Object XML
$xml.Load("D:\source.xml")  
$attributes = $xml.SelectSingleNode('/Batch/Documents/Document[@ID=0]/Pages/Page[@ID=0]/Front/Attributes')  
$number = $attributes.Barcode[0].innerText
$attributes.Barcode[0].Id = "5000"  
$attributes.Barcode[0].innerText = "000001111118"  
$attributes.Barcode[1].Id = "5100"  
$attributes.Barcode[1].innerText = $number
[void]$attributes.RemoveChild($attributes.Paginator)
$newNode = $attributes.Barcode[1].CloneNode($true)
$newNode.Id = "5101"  
$newNode.innerText = "000001111118"  
$attributes.AppendChild($newNode)
$xml.Save("D:\neu.xml")  

Das scheint ja perfekt zu funktionieren.
VIELEN DANK!!!

Jetzt muss ich es noch ausarbeiten, denn das Script soll später noch mehr Aufgaben machen, aber ich denke, dass bekomme ich alleine hin. Wenn nicht, dann melde ich mich wieder.

Wünsche ein schönes Wochenende
Member: Haberl92
Haberl92 Jul 14, 2023 at 17:01:48 (UTC)
Goto Top
ein kleines Problem hab ich jetzt doch noch. und Zwar müsste ich das Script für mehrere Dateien mit "Foreach" anwenden und ich weiß jetzt nicht, wie er jedes File in diesem Fall einlesen kann

$Source = 'C:\Temp\'  
$Result = Select-String -Pattern 'Beleg ausserhalb der Lieferung im Stapel null Beleg 0' -Path "$Source\*.error" -Exclude "*.xml.error" -List  
Foreach ($File in $Result) {

$xml = New-Object XML
$xml.Load($File)  
$attributes = $xml.SelectSingleNode('/Batch/Documents/Document[@ID=0]/Pages/Page[@ID=0]/Front/Attributes')    
$number = $attributes.Barcode[0].innerText
$attributes.Barcode[0].Id = "5000"    
$attributes.Barcode[1].Id = "5100"    
$attributes.Barcode[1].innerText = $number
$attributes.Barcode[0].innerText = "000001111118"    
$newNode = $attributes.Barcode[1].CloneNode($true)
$newNode.Id = "5101"    
$newNode.innerText = "000001111118"    
$attributes.AppendChild($newNode)
$attributes.RemoveChild($attributes.Paginator)
$xml.Save("C:\Temp\neu.xml")  
}  
Mitglied: 7426148943
7426148943 Jul 14, 2023 updated at 17:16:32 (UTC)
Goto Top
$Source = 'C:\Temp\'  
$files = Select-String -Pattern 'Beleg ausserhalb der Lieferung im Stapel null Beleg 0' -SimpleMatch -Path "$Source\*.error" -Exclude "*.xml.error" -List | select -Expand Path  
Foreach ($File in $files){
    $xml = New-Object XML
    $xml.Load($File)
    $attributes = $xml.SelectSingleNode('/Batch/Documents/Document[@ID=0]/Pages/Page[@ID=0]/Front/Attributes')      
    $number = $attributes.Barcode[0].innerText
    $attributes.Barcode[0].Id = "5000"      
    $attributes.Barcode[1].Id = "5100"      
    $attributes.Barcode[1].innerText = $number
    $attributes.Barcode[0].innerText = "000001111118"      
    $newNode = $attributes.Barcode[1].CloneNode($false)
    $newNode.Id = "5101"      
    $newNode.innerText = "000001111118"      
    $attributes.AppendChild($newNode)
    $attributes.RemoveChild($attributes.Paginator)
    $xml.Save($file)
}

Bitte dann How can I mark a post as solved?
Member: Haberl92
Haberl92 Jul 14, 2023 at 17:20:43 (UTC)
Goto Top
damit sagt er mir folgende Fehler:

Ausnahme beim Aufrufen von "Load" mit 1 Argument(en):  "Ungültige Daten auf Stammebene. Zeile 1, Position 1."  
In C:\Temp\Beleg0-Error\Beleg0.ps1:5 Zeichen:5
+     $xml.Load($File)
+     ~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : DotNetMethodException
 
Es ist nicht möglich, einen Index auf ein NULL-Array anzuwenden.
In C:\Temp\Beleg0-Error\Beleg0.ps1:7 Zeichen:5
+     $number = $attributes.Barcode[0].innerText
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : NullArray
 
Es ist nicht möglich, einen Index auf ein NULL-Array anzuwenden.
In C:\Temp\Beleg0-Error\Beleg0.ps1:8 Zeichen:5
+     $attributes.Barcode[0].Id = "5000"  
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : NullArray
 
Es ist nicht möglich, einen Index auf ein NULL-Array anzuwenden.
In C:\Temp\Beleg0-Error\Beleg0.ps1:9 Zeichen:5
+     $attributes.Barcode[1].Id = "5100"  
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : NullArray
 
Es ist nicht möglich, einen Index auf ein NULL-Array anzuwenden.
In C:\Temp\Beleg0-Error\Beleg0.ps1:10 Zeichen:5
+     $attributes.Barcode[1].innerText = $number
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : NullArray
 
Es ist nicht möglich, einen Index auf ein NULL-Array anzuwenden.
In C:\Temp\Beleg0-Error\Beleg0.ps1:11 Zeichen:5
+     $attributes.Barcode[0].innerText = "000001111118"  
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : NullArray
 
Es ist nicht möglich, einen Index auf ein NULL-Array anzuwenden.
In C:\Temp\Beleg0-Error\Beleg0.ps1:12 Zeichen:5
+     $newNode = $attributes.Barcode[1].CloneNode($false)
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : NullArray
 
Es ist nicht möglich, eine Methode für einen Ausdruck aufzurufen, der den NULL hat.
In C:\Temp\Beleg0-Error\Beleg0.ps1:15 Zeichen:5
+     $attributes.AppendChild($newNode)
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull
 
Es ist nicht möglich, eine Methode für einen Ausdruck aufzurufen, der den NULL hat.
In C:\Temp\Beleg0-Error\Beleg0.ps1:16 Zeichen:5
+     $attributes.RemoveChild($attributes.Paginator)
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull
 
Ausnahme beim Aufrufen von "Save" mit 1 Argument(en):  "Ungültiges XML-Dokument. Das Dokument hat kein Stammelement."  
In C:\Temp\Beleg0-Error\Beleg0.ps1:17 Zeichen:5
+     $xml.Save($file)
+     ~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : DotNetMethodException
Member: aqui
aqui Jul 14, 2023 updated at 18:01:13 (UTC)
Goto Top
aber das passt leider nicht ganz.
Dann hast du es oben aber völlig falsch beschrieben
"die 10-stellige Nummer aus der Zeile 20 auslesen und dann die Zeilen 20 bis 22 mit dem Inhalt aus Zeile 20 neu abspeichern."
Nicht nur Kollege @7426148943 sondern jeder normal Denkende interpretiert das so das alle Zeilen von 20 bis 22 den identischen Wert "0139956605" haben. face-sad
Member: Haberl92
Haberl92 Jul 14, 2023 at 17:59:28 (UTC)
Goto Top
Zitat von @aqui:

aber das passt leider nicht ganz.
Dann hast du es oben aber völlig falsch beschrieben
"die 10-stellige Nummer aus der Zeile 20 auslesen und dann die Zeilen 20 bis 22 mit dem Inhalt aus Zeile 20 neu abspeichern."
Jeder normal Denkende interpretiert das so das alle Zeilen von 20 bis 22 den identischen Wert "0139956605" hat. face-sad

Tut mir leid, wenn es missverständlich war, aber deswegen habe ich ja auch noch das gewünschte Resultat geschrieben
Mitglied: 7426148943
7426148943 Jul 14, 2023 updated at 18:08:43 (UTC)
Goto Top
Fehlermeldung lesen hilft ...
Deine XML Dateien sind fehlerhaft
Ungültige Daten auf Stammebene. Zeile 1, Position 1.";
Member: Haberl92
Haberl92 Jul 14, 2023 at 18:12:38 (UTC)
Goto Top
Zitat von @7426148943:

Fehlermeldung lesen hilft ...
Deine XML Dateien sind fehlerhaft
Ungültige Daten auf Stammebene. Zeile 1, Position 1.";

mit XML-Bearbeitung hab ich mich noch nie richtig ausgekannt.
Aber die XML sind nicht fehlerhaft, die kommen von einer Maschine und werden vom System wieder eingelesen und das ohne Probleme
Mitglied: 7426148943
Solution 7426148943 Jul 14, 2023 updated at 21:29:59 (UTC)
Goto Top
Zitat von @Haberl92
mit XML-Bearbeitung hab ich mich noch nie richtig ausgekannt.
Dann verstehst du vermutlich auch nicht was ich mit nicht korrekt meine.
Aber die XML sind nicht fehlerhaft, die kommen von einer Maschine und werden vom System wieder eingelesen und das ohne Probleme
Das die Maschine sie liest heißt nicht das sie auch korrekt ist, sie ignoriert wohl nur das Encoding.
Die Meldung kommt zu 99% dann, wenn das Encoding in der XML-Declaration nicht mit dem tatsächlichen Encoding der Datei übereinstimmt. Z.B. auch wenn die Datei ein BOM hat.
Wenn das der Fall ist wirst du wohl den Inhalt mit Get-Content einlesen und als XML umwandeln müssen.
Enconding bei Get-Content bei Bedarf anpassen.
Ohne die Files hier vorliegen zu haben natürlich ohne Gewähr... Glaskugel am Freitag eben.
$Source = 'C:\Temp\'    
$files = Select-String -Pattern 'Beleg ausserhalb der Lieferung im Stapel null Beleg 0' -SimpleMatch -Path "$Source\*.error" -Exclude "*.xml.error" -List | select -Expand Path    
Foreach ($File in $files){
    $xml = [xml](Get-Content $file -Encoding Default)
    $attributes = $xml.SelectSingleNode('/Batch/Documents/Document[@ID=0]/Pages/Page[@ID=0]/Front/Attributes')        
    $number = $attributes.Barcode[0].innerText
    $attributes.Barcode[0].Id = "5000"        
    $attributes.Barcode[1].Id = "5100"        
    $attributes.Barcode[1].innerText = $number
    $attributes.Barcode[0].innerText = "000001111118"        
    $newNode = $attributes.Barcode[1].CloneNode($false)
    $newNode.Id = "5101"        
    $newNode.innerText = "000001111118"        
    $attributes.AppendChild($newNode)
    $attributes.RemoveChild($attributes.Paginator)
    $xml.Save($file)
}
Member: Haberl92
Haberl92 Jul 14, 2023 at 19:50:07 (UTC)
Goto Top
ich werde das morgen nochmal testen. Jetzt geht es erst mal in den schönen Feierabend, den ich euch auch wünsche.

Nochmals möchte ich mich für die Hilfe bedanken.
Member: Haberl92
Haberl92 Jul 17, 2023 at 12:57:09 (UTC)
Goto Top
Hallo zusammen,
habe es am Samstag leider nicht mehr geschafft, weiter zu machen. Dafür hab ich mich jetzt nochmal dran gesetzt.

Mein Code der bisher funktioniert:
$Source = 'C:\Temp\'  
$Result = Select-String -Pattern 'Beleg ausserhalb der Lieferung im Stapel null Beleg' -Path "$Source\*.error" -Exclude "*.xml.error" -List  
Foreach ($File in $Result) {
    $xml = New-Object XML
    $xml.Load("C:\Temp\AZHscan_4_230714_700000_00484.xml.error")    
    $attributes = $xml.SelectSingleNode('/Batch/Documents/Document[@ID=0]/Pages/Page[@ID=0]/Front/Attributes')    
    $number = $attributes.Barcode[0].innerText
    $attributes.Barcode[0].Id = "5000"    
    $attributes.Barcode[0].innerText = "000001111118"    
    $attributes.Barcode[1].Id = "5100"    
    $attributes.Barcode[1].innerText = $number
    [void]$attributes.RemoveChild($attributes.Paginator)
    $newNode = $attributes.Barcode[1].CloneNode($false)
    $newNode.Id = "5101"    
    $newNode.innerText = "000001111118"    
    $attributes.AppendChild($newNode)
    $xml.Save("C:\Temp\neu.xml")    
}

Nun funktioniert es aber nicht, den Dateinamen in der Schleife zu laden.
Mein Versuch
$xml.Load($File)   
funktionert leider nicht.
Wo liegt da der Fehler?

Und noch eine Frage:
Wie ihr seht, hat die Ursprungs-Datei eine zusätliche ".error"-Endung, dies müsste bei dem neuen Namen entfernt werden
Mitglied: 7426148943
7426148943 Jul 17, 2023 updated at 13:02:01 (UTC)
Goto Top
Wo liegt da der Fehler?
Schau dir meinen Code in Zeile 2 nochmal genau an dann siehst du warum, du expandiert die Property nicht. Du bekommst ja von Select-String ein Object mit mehreren Eigenschaften geliefert und der Pfad steht nur in der Property Path
Wie ihr seht, hat die Ursprungs-Datei eine zusätliche ".error"-Endung, dies müsste bei dem neuen Namen entfernt werden
Replace ist dein Freund
# ....
$newpath = $file -replace '\.error$'  
$xml.Save($newpath)
Member: Haberl92
Haberl92 Jul 17, 2023 at 13:09:10 (UTC)
Goto Top
Zitat von @7426148943:

Wo liegt da der Fehler?
Schau dir meinen Code in Zeile 2 nochmal genau an dann siehst du warum, du expandiert die Property nicht. Du bekommst ja von Select-String ein Object mit mehreren Eigenschaften geliefert und der Pfad steht nur in der Property Path

Jedoch mit dem Code funktioniert es bei mir nicht.
Ich brauche diese Zeilen
    $xml = New-Object XML
    $xml.Load("C:\Temp\AZHscan_4_230714_700000_00484.xml.error")   
ansonsten gibt er mir die Fehler wegen der angebliche fehlerhaften XML

ich habe
| select -Expand Path
nun auch noch angefügt, aber es ändert nichts
Mitglied: 7426148943
7426148943 Jul 17, 2023 updated at 13:18:40 (UTC)
Goto Top
Nö, klappt hier im Test einwandfei ... Siehe mein Code.
Du kannst Zeile 3 auch so schreiben, kommt auf das gleiche drauf raus.
$Result = Get-ChildItem "$Source\*" -File -Include *.error -Exclude *.xml.error | ?{(Get-Content $_.Fullname -Raw) -like '*Beleg ausserhalb der Lieferung im Stapel null Beleg*' | Select -ExpandProperty Fullname  
Member: Haberl92
Haberl92 Jul 17, 2023 at 13:19:08 (UTC)
Goto Top
Zitat von @7426148943:

Replace ist dein Freund
# ....
$newpath = $file -replace '\.error$'  
$xml.Save($newpath)

mit diesem Code hat er die komplette Endung gelöscht.
Zur Vollständigkeit, damit andere die diesen Thread lesen, es auch wissen:
$newpath = $file -replace '\.error$', '.xml'   

der Fehler kommt vermutlich daher, dass ich am Anfang in einer anderen Datei nach Stichwörtern suche und den Dateinamen, da übernehme
diese haben keine Endung mit .xml.error sondern nur die Endung ".error"
Mitglied: 7426148943
7426148943 Jul 17, 2023 updated at 13:23:58 (UTC)
Goto Top
mit diesem Code hat er die komplette Endung gelöscht.
Tja deswegen sollte seine Fragen besser schreiben du wolltest in deinem Satz nur die Endung entfernen nicht durch eine andere ersetzen 😀

Ich bin jetzt raus, du hast jetzt das nötige Handwerkszeug und die anfängliche Frage des Threads und die anderen wurden hinreichend beantwortet.

So denn viel Spaß noch mit der PS.

Zeppel
Member: Haberl92
Haberl92 Jul 17, 2023 at 13:29:57 (UTC)
Goto Top
Zitat von @7426148943:

mit diesem Code hat er die komplette Endung gelöscht.
Tja deswegen sollte seine Fragen besser schreiben du wolltest in deinem Satz nur die Endung entfernen nicht durch eine andere ersetzen 😀

Ich bin jetzt raus, du hast jetzt das nötige Handwerkszeug und die anfängliche Frage des Threads und die anderen wurden hinreichend beantwortet.

So denn viel Spaß noch mit der PS.

Zeppel

In meiner Frage habe ich gesagt, dass die Datei eine zusätzliche Endung hat (sieht man auch im Code)
$xml.Load("C:\Temp\AZHscan_4_230714_700000_00484.xml.error"  
aber egal, jetzt passt das Ergebnis.

@7426148943
ich danke dir vielmals für deine Hilfe.
Ich versuche es jetzt noch weiter, wenn ich wieder Hilfe benötige, dann öffne ich einen neuen spezifischeren Thread
Mitglied: 7426148943
7426148943 Jul 17, 2023 updated at 13:37:13 (UTC)
Goto Top
Zitat von @Haberl92:
In meiner Frage habe ich gesagt, dass die Datei eine zusätzliche Endung hat (sieht man auch im Code)
$xml.Load("C:\Temp\AZHscan_4_230714_700000_00484.xml.error"  
Eben und warum sollte man da nochmal ".xml" anhängen wenn es doch schon vorhanden ist, entfernen reicht hier ja dann??
"C:\Temp\AZHscan_4_230714_700000_00484.xml.error" -replace '\.error$'  
Ergibt
C:\Temp\AZHscan_4_230714_700000_00484.xml
Wohingegen
"C:\Temp\AZHscan_4_230714_700000_00484.xml.error" -replace '\.error$','.xml'  
ergibt
C:\Temp\AZHscan_4_230714_700000_00484.xml.xml
Doppelt gemoppelt macht doch keinen Sinn
@7426148943
ich danke dir vielmals für deine Hilfe.
Bidde.
Member: Haberl92
Haberl92 Jul 17, 2023 updated at 13:58:00 (UTC)
Goto Top
Zitat von @7426148943:

Zitat von @Haberl92:

"C:\Temp\AZHscan_4_230714_700000_00484.xml.error" -replace '\.error$','.xml'  
ergibt
C:\Temp\AZHscan_4_230714_700000_00484.xml.xml
Doppelt gemoppelt macht doch keinen Sinn

wie oben erwähnt nehme ich den Dateinamen aus einer gleichnamigen Datei, welche nur die "error"-Endung hat.
Wichtig ist, dass es jetzt funktioniert. Das mit den zwei Dateien ist leider kompliziert zu erklären

Vielleicht macht dies auch Probleme beim Hauptscript?
Mitglied: 7426148943
7426148943 Jul 17, 2023 updated at 13:59:02 (UTC)
Goto Top
Zitat von @Haberl92:
wie oben erwähnt nehme ich den Dateinamen aus einer gleichnamigen Datei, welche nur die "error"-Endung hat.
Wusste ich nicht dachte die XML ist die in der du den Inhalt findest, dann ist es klar, hier weiß ja niemand wie der Inhalt der Datei überhaupt aussieht in der die Dateinamen stehen ... Du siehst von Anfange gleich eindeutig beschreiben hat Vorteile face-wink.
Member: Haberl92
Haberl92 Jul 17, 2023 at 14:07:24 (UTC)
Goto Top
wie ich vermutet habe, lag daran auch der Fehler, dass es bei mir nicht funktioniert hat.

Nun mein endgültiges Script:
$Source = 'C:\Temp\'  
$Result = Select-String -Pattern 'Beleg ausserhalb der Lieferung im Stapel null Beleg' -Path "$Source\*.error" -Exclude "*.xml.error" -List  | select -Expand Path  
Foreach ($File in $Result) {
    $File = $File -replace '\.error$', '.xml.error'  
    $xml = New-Object XML
    $xml.Load($File)  
    $attributes = $xml.SelectSingleNode('/Batch/Documents/Document[@ID=0]/Pages/Page[@ID=0]/Front/Attributes')    
    $number = $attributes.Barcode[0].innerText
    $attributes.Barcode[0].Id = "5000"    
    $attributes.Barcode[0].innerText = "000001111118"    
    $attributes.Barcode[1].Id = "5100"    
    $attributes.Barcode[1].innerText = $number
    [void]$attributes.RemoveChild($attributes.Paginator)
    $newNode = $attributes.Barcode[1].CloneNode($false)
    $newNode.Id = "5101"    
    $newNode.innerText = "000001111118"    
    $attributes.AppendChild($newNode)
    $newpath = $file -replace '\.error$'   
    $xml.Save($newpath) 
}

ich musste vorher den Namen richtig ändern, damit er es kennt.
Nachher ist natürlich die XML-Endung doppelt, weshalb ich da wieder deinen ursprüngliche Replace-Befehl verwendet habe.

Nun funktioniert es wunderbar, genau so habe ich es mir vorgestellt.

Nochmal vielen herzlichen Dank