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-ID: 7850120026

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

Ausgedruckt am: 22.11.2024 um 01:11 Uhr

Haberl92
Haberl92 14.07.2023 um 17:19:34 Uhr
Goto Top
das "zu weit eingerückte" bitte nicht beachten, war ein Copy-Fehler
7426148943
7426148943 14.07.2023 aktualisiert um 17:45:48 Uhr
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
Haberl92
Haberl92 14.07.2023 um 18:34:32 Uhr
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
7426148943
7426148943 14.07.2023 aktualisiert um 18:48:43 Uhr
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")  
Haberl92
Haberl92 14.07.2023 um 18:53:36 Uhr
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
Haberl92
Haberl92 14.07.2023 um 19:01:48 Uhr
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")  
}  
7426148943
7426148943 14.07.2023 aktualisiert um 19:16:32 Uhr
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 Wie kann ich einen Beitrag als gelöst markieren?
Haberl92
Haberl92 14.07.2023 um 19:20:43 Uhr
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
aqui
aqui 14.07.2023 aktualisiert um 20:01:13 Uhr
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
Haberl92
Haberl92 14.07.2023 um 19:59:28 Uhr
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
7426148943
7426148943 14.07.2023 aktualisiert um 20:08:43 Uhr
Goto Top
Fehlermeldung lesen hilft ...
Deine XML Dateien sind fehlerhaft
Ungültige Daten auf Stammebene. Zeile 1, Position 1.";
Haberl92
Haberl92 14.07.2023 um 20:12:38 Uhr
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
7426148943
Lösung 7426148943 14.07.2023 aktualisiert um 23:29:59 Uhr
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)
}
Haberl92
Haberl92 14.07.2023 um 21:50:07 Uhr
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.
Haberl92
Haberl92 17.07.2023 um 14:57:09 Uhr
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
7426148943
7426148943 17.07.2023 aktualisiert um 15:02:01 Uhr
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)
Haberl92
Haberl92 17.07.2023 um 15:09:10 Uhr
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
7426148943
7426148943 17.07.2023 aktualisiert um 15:18:40 Uhr
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  
Haberl92
Haberl92 17.07.2023 um 15:19:08 Uhr
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"
7426148943
7426148943 17.07.2023 aktualisiert um 15:23:58 Uhr
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
Haberl92
Haberl92 17.07.2023 um 15:29:57 Uhr
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
7426148943
7426148943 17.07.2023 aktualisiert um 15:37:13 Uhr
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.
Haberl92
Haberl92 17.07.2023 aktualisiert um 15:58:00 Uhr
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?
7426148943
7426148943 17.07.2023 aktualisiert um 15:59:02 Uhr
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.
Haberl92
Haberl92 17.07.2023 um 16:07:24 Uhr
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