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:
Liegt das Verhalten am Skript selbst oder mach ich mit der ISE da etwas verkehrt?
Grüße
Forseti
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 640119
Url: https://administrator.de/forum/powershell-skript-eigenleben-640119.html
Ausgedruckt am: 27.12.2024 um 05:12 Uhr
4 Kommentare
Neuester Kommentar
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
}
}
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.
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