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

Url: https://administrator.de/forum/powershell-skript-eigenleben-640119.html

Ausgedruckt am: 27.12.2024 um 05:12 Uhr

147069
Lösung 147069 13.01.2021 aktualisiert um 12:47:07 Uhr
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  
    }
}
tagol01
Lösung tagol01 13.01.2021 um 12:18:29 Uhr
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
Forseti2003
Forseti2003 13.01.2021 um 13:28:00 Uhr
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.
Forseti2003
Forseti2003 13.01.2021 um 13:30:53 Uhr
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.