forseti2003
Goto Top

Powershell Skript - Eigenleben

Ein Hallo in die Runde,

ich hab da eine Frage zu PowerShell. Folgendes Szenario: Ich erhalte eine XML-Datei die ich in CSV konvertieren möchte. Entsprechend hab ich das Skript aufgebaut. Nun passieren aber ein paar Eigenartigkeiten in dem Skript.

1) Ist die Powershell gestartet und ich tausch die Datei zum konvertieren aus (XML1 zu XML2), erzeugt er mir als CSV auch die XML1 obwohl diese nicht mehr im Verzeichnis ist. Starte ich die ISE neu, macht er es richtig.

2) Liegt eine Datei drin, passiert es recht häufig das er diese nicht konvertiert, erst wenn ich den Ausführen Button 2-3x betätigt habe, legt er los

Das Skript selbst sieht so aus:

# Datei  laden
$file = gci -Path $eingang -recurse -file *.xml

foreach ($a in $file){

[XML]$xml = get-content $a.FullName| ForEach-Object{$_

#export xml as csv
$lieferant = $xml.stx3.group.dealerships.dealership.branches.branch.address
$organisation = $xml.stx3.invoices.invoice.receiver.customer_number
$fahrzeug = $xml.stx3.vehicle_data.vehicles.vehicle
$faktura = $xml.stx3.invoices.invoice
$invoice = $xml.stx3.invoices.invoice.invoiceposition

foreach ($fpos in $faktura)
{
$fnr = $fpos.invoice_number

$Header = "Pos-Nummer;Pos-Text;Pos-Amount;Pos-AmountUnit;Pos-Netprise;Pos-Fahrzeug;Fakturadatum;Fakturanummer;ImpLieferant;ImpOrga;ImpInfo;Orderdate"  
Set-Content $header -Path $ausgang"NFZ"$fnr".csv" -Encoding UTF8  

foreach ($pos in $invoice)
{
$Ausgabe = $pos.number + ";" + $pos.text + ";" + $pos.amount + ";" + $pos.amount_unit + ";" + $pos.netprice + ";" + $fahrzeug.licence_number + ";" + $faktura.invoice_date + ";" + $faktura.invoice_number + ";" + $lieferant.name + ";" + $organisation +";"+ $pos.text +"*"+ $lieferant.name + ";"+ $faktura.orderdate  
$ausgabe | Out-File -FilePath $ausgang"NFZ"$fnr".csv" -Append -Encoding UTF8  
}
}
}

Liegt das Verhalten am Skript selbst oder mach ich mit der ISE da etwas verkehrt?

Grüße
Forseti

Content-Key: 640119

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

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

Mitglied: 147069
Solution 147069 Jan 13, 2021 updated at 11:47:07 (UTC)
Goto Top
Liegt das Verhalten am Skript selbst
Ja, erstens fehlen einige Variablen fehlen/sind bei dir nicht definiert und liegen noch als Cache im Speicher der ISE. In der ISE muss man immer dafür sorgen das Variablen bei jedem Aufruf des Skripts auch wieder richtig initialisiert(mit aktuellen Werten versehen) werden. Vergisst man das könnten darin noch alte Werte vom vorherigen Ausführen liegen.

Btw, es gibt mit Powershell viel effektivere Methoden eine CSV zu erzeugen als die Strings aneinander zu pappen und wegzuschreiben. Für sowas erstellt man optimalerweise ein Custom-Object und leitet das an Export-CSV.

Ich würde das so ordentlicher strukturieren
$eingang = 'D:\Eingang'  
$ausgang = 'D:\Ausgang'  

$files = gci $eingang -recurse -file -Filter *.xml

foreach ($file in $files){
    $xml = New-Object XML
    $xml.Load($file.FullName)
    $lieferant = $xml.stx3.group.dealerships.dealership.branches.branch.address
    $organisation = $xml.stx3.invoices.invoice.receiver.customer_number
    $fahrzeug = $xml.stx3.vehicle_data.vehicles.vehicle
    $faktura = $xml.stx3.invoices.invoice
    foreach ($fpos in $faktura){
        $fnr = $fpos.invoice_number
        $result = foreach($pos in $fpos.invoiceposition){
            [pscustomobject]@{
                'Pos-Nummer' = $pos.number  
                'Pos-Text' = $pos.text  
                'Pos-Amount' = $pos.amount  
                'Pos-AmountUnit' = $pos.amount_unit  
                'Pos-Netprise' = $pos.netprice  
                'Pos-Fahrzeug' = $fahrzeug.licence_number  
                Fakturadatum = $fpos.invoice_date
                Fakturanummer = $fpos.invoice_number
                ImpLieferant = $lieferant.name
                ImpOrga = $organisation
                ImpInfo = $pos.text + "*" + $lieferant.name  
                Orderdate = $fpos.orderdate
            }
        }
        $result | export-csv (join-path $ausgang "NFZ$fnr.csv") -Delimiter ";" -NoType -Encoding UTF8  
    }
}
Member: tagol01
Solution tagol01 Jan 13, 2021 at 11:18:29 (UTC)
Goto Top
Zitat von @Forseti2003:
1) Ist die Powershell gestartet und ich tausch die Datei zum konvertieren aus (XML1 zu XML2), erzeugt er mir als CSV auch die XML1 obwohl diese nicht mehr im Verzeichnis ist. Starte ich die ISE neu, macht er es richtig.

bekanntes problem von ISE

siehe loesung: ise variablen
Member: Forseti2003
Forseti2003 Jan 13, 2021 at 12:28:00 (UTC)
Goto Top
Danke für den Hinweis, ist mir früher nie aufgefallen, hab daher gedacht es liegt eher am Skript. Aber Super, mit der Variable klappt es jetzt wie gewollt.
Member: Forseti2003
Forseti2003 Jan 13, 2021 at 12:30:53 (UTC)
Goto Top
Zitat von @147069:

Liegt das Verhalten am Skript selbst
Ja, erstens fehlen einige Variablen fehlen/sind bei dir nicht definiert und liegen noch als Cache im Speicher der ISE. In der ISE muss man immer dafür sorgen das Variablen bei jedem Aufruf des Skripts auch wieder richtig initialisiert(mit aktuellen Werten versehen) werden. Vergisst man das könnten darin noch alte Werte vom vorherigen Ausführen liegen.


Die Variablen-Deklaration hatte ich jetzt hier im Beitrag weggelassen, sorry mein Fehler.

Btw, es gibt mit Powershell viel effektivere Methoden eine CSV zu erzeugen als die Strings aneinander zu pappen und wegzuschreiben. Für sowas erstellt man optimalerweise ein Custom-Object und leitet das an Export-CSV.

Ich würde das so ordentlicher strukturieren

Da hast Du Recht - vielen Dank für den Hinweis, das man die Struktur so erstellen kann, war mir noch nicht bekannt, ist aber wirklich deutlich eleganter. Vielen Dank.