Jump to content

epsodus

Newbie
  • Content Count

    28
  • Joined

  • Last visited

Everything posted by epsodus

  1. Hallo zusammen, ich habe mal eine Frage zum Thema Powershell und Get-ChildItem und match. Ich habe mehrere Dateien, welche mit .csv enden. Aus diesen möchte ich bestimmte Dateinamen mit bestimmten Merkmalen identifizieren und umbenennen. Hier mal drei Beispiele: TEST.BARN.G1T3F.02983100.B200225.T014508.X02.CSV TEST.BARN.G1B53.02983104.D200225.T014508.C02.0400.CSV TEST.BARN.G9T3F.02981185.B200225.T014508.X02.CSV Ich möchte Dateinamen identifizieren und umbenennen die z.B. das Merkmal G1T3F und 3100 haben. Dies mache ich wie folgt: Get-ChildItem $DTCC_ROOT | where { $_.Name -match "G[0-9]{1}T[A-Z0-9]{2}" -and $_.Name -match "31[0-9]{2}" } | Rename-Item -NewName { $_.name -Replace '\.CSV$', '.XML' } Da das Merkmal G1T3F variieren kann, ebenso 3100 matche ich wie folgt: G1T3F mit "G[0-9]{1}T[A-Z0-9]{2} und 3100 mit "31[0-9]{2}"" Wenn beide Bedingungen erfüllt sind, soll dewr Dateiname von der Endung .csv nach .xml umbenannt werden. Leider funktioniert das nicht. Es wird z.B. auch der Dateiname TEST.BARN.G9T3F.02981185.B200225.T014508.X02.CSV umbenannt. Kann mir jemand erklären warum es so nicht funktioniert und hätte einen Lösungsvorschlag ?
  2. Ich habe jetzt mal folgendes eingefügt: $error | %{ $_ | select CategoryInfo, Exception | fl } damit bekomme ich den Fehler angezeigt und kann ihn jetzt wegschreiben. Werde das Script jetzt mit try catch erweitern Danke, für die Hinweise
  3. Hallo, einige Errormeldungen kann ich abfangen und dazu Aktionen ausführen. Jetzt meine Frage, Wenn ich eine Datei verschieben möchte und diese im Zielverzeichnis vorhanden ist, bekomme ich die folgende Fehlermeldung: ERROR: Rename-Item : Eine Datei kann nicht erstellt werden, wenn sie bereits vorhanden ist. ERROR: ERROR: In C:\XXXX TEST\XXXXRepPS_V4_0_xml_csv.ps1:434 Zeichen:4 ERROR: + Rename-Item -Path $XXXX_YYYYYYYXMLFILE -NewName $VVVVVVVV ... ERROR: + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ERROR: + CategoryInfo : WriteError: (C:\XXXX TEST\im...54.C02.0335.xml:String) [Rename-Item], IOException ERROR: + FullyQualifiedErrorId : RenameItemIOError,Microsoft.PowerShell.Commands.RenameItemCommand ERROR: wie kann ich diese Meldung in ein Log schreiben ?
  4. Hallo, hat etwas gedauert, habe das Programm mal aufgeräumt und dokumentiert. das Überschreiben mit einer gefundenen und doppelten Lei habe ich jetzt auch gelöst. Jetzt muss ich die erstellten Files nur noch gegen das Excelsheet abgleichen ( Spalte C ) und bei einer Übereinstimmung renamen, Wert aus Excelsheet Spalte (A) in der gleichen Zeile wie der gefundene Wert aus Spalte C. Das File soll dann mit dem Wert aus Spalte A anfangen. Da happert es noch. #-------------------------------------------------------------------------------------------------------------------------------------------- # ROOTVERZEICHNIS, wo die zu verarbeitende Quell Datei liegt $Gaudet_ROOT = "C:\TEMP" $Gaudet_ROOTFILE = $Gaudet_ROOT + "\" + $XML_FILE #-------------------------------------------------------------------------------------------------------------------------------------------- # Verzeichnis wo die neu erstellten Files abgelegt werden $Gaudet_RSRXML = "C:\TEMP\TESTARCHIV" $Gaudet_RSRXMLFILE = $Gaudet_RSRXML + "\" + $XML_FILE #-------------------------------------------------------------------------------------------------------------------------------------------- # Verzeichnis wo das Excel File liegt $ExcelMappe = "C:\TEMP\ExcelArchiv" #-------------------------------------------------------------------------------------------------------------------------------------------- function gaudet_RSRXML {# Das XML File wird extrahiert, aus jedem Knoten ( LEI) wird ein separates File erstellt, die LEI des Knoten vorangestellt "function gaudet_RSRXML" $inputXMLFile = Join-Path -Path $Gaudet_ROOT -ChildPath $XML_FILE $xml = [xml](Get-Content $inputXMLFile) Foreach ($ChildNode in $xml.SctiesFincgRptgMssngCollReq.TxId) { $CurrentXMLFileName = Join-Path -Path $Gaudet_RSRXML -ChildPath ($ChildNode.RptgCtrPty.lei.ToString() + "." + $XML_FILE) $NewXML = New-Object System.Xml.XmlDocument $declaration = $NewXML.CreateXmlDeclaration("1.0", "UTF-8", $null) $NewXML.AppendChild($declaration) $RootNode = $NewXML.CreateNode('element', 'SctiesFincgRptgMssngCollReq', $null) $NewXML.AppendChild($RootNode) $NewElement = $NewXML.ImportNode($ChildNode, $true) $Root = $NewXML.SelectSingleNode('SctiesFincgRptgMssngCollReq') $Root.AppendChild($NewElement) #$File1.DocumentElement.AppendChild($File1.ImportNode($XmlNode, $true)) $FILE = ($ChildNode.RptgCtrPty.lei + "." + $XML_FILE) # Überschreiben einer doppelten Lei wird verhindert, kommt ein File zweimal vor, dann wird ein datum hinten dran gehängt $TESTPATH = Test-Path -path ($Gaudet_RSRXML + "\" + $FILE) if ($TESTPATH -eq $TRUE) { rename-item -Path ($Gaudet_RSRXML + "\" + $FILE) -NewName ($FILE + "_" + (get-date).ToString("yyyyMMdd_HHmmss")) #$File.DocumentElement.AppendChild($File.ImportNode($ChildNode, $true)) } $NewXML.Save($CurrentXMLFileName) Write-Host $ChildNode.RptgCtrPty.lei Write-Host $CurrentXMLFileName } } #H A U P T S C R I P T für XML Dateien ############################################################################################ #----------------------------------------------------------------------- #Liste der Dateinamen *.XML, die angeliefert wurden if ($Gaudet_FILELIST = get-childitem $Gaudet_ROOT -filter *.xml) { $Gaudet_COUNT = (get-childitem $Gaudet_ROOT -filter *.xml).count "Im Ordner " + $Gaudet_ROOT + " liegen folgende " + $Gaudet_COUNT + " Dateien: " + $Gaudet_FILELIST <# #Jede der angelieferten Dateien .xml in netroot\import\dtcc wird bearbeitet. Die erste Zeile in der Datei wird ausgeschnitten. # Die angelieferte Datei entspricht nicht der XML Struktur, durch XXXX wird eine zusätzliche Zeile eingefügt, welche entfernt wird. $file = "$Gaudet_ROOT\*.xml" Get-ChildItem -Path $file -File -Filter *.xml | ForEach-Object { (Get-Content -Path $_.FullName | Select-Object -Skip 1) | Set-Content -Path $_.FullName -Encoding UTF8 #> } #Jede der angelieferten Dateien in netroot\import\dtcc wird nach mehreren Mustern durchsucht. foreach ($XML_FILE in $Gaudet_FILELIST) { #Datei in netroot\import\DTCC $Gaudet_ROOTFILE = $Gaudet_ROOT + "\" + $XML_FILE #Dateiinhalt einlesen aus Datei in netroot\import\DTCC [array]$Gaudet_FILECONTENT = get-content (get-childitem $Gaudet_ROOTFILE) #Anzahl der Zeilen in der Datei netroot\import\DTCC $Gaudet_FILELINECOUNT = $Gaudet_FILECONTENT.count "Zeilen in der Datei: " + $Gaudet_FILELINECOUNT # S U C H M U S T E R für XML Dateien #----------------------------------------------------------------------- #Suchmuster für RSRXML-Dateien (3105 im Dateinamen ) $PATTERN_RSRXML = "YYY\d{1}\.XXXX\.T[A-Z0-9]{4}\.[A-Z0-9]{4}3105\.D[A-Z0-9]*\.Z[A-Z0-9]*\.K[\w\d\W]*\.XML" # YYY4.XXXX.TV9V9.55553105.D111111.Z999999.K02.0396.xml #$PATTERN_XLSXML = "[A-Z0-9]{20}\.YYY\d{1}\.XXXX\.T[A-Z0-9]{4}\.[A-Z0-9]{4}3105\.D[A-Z0-9]*\.Z[A-Z0-9]*\.K[\w\d\W]*\.XML" # 664400KX2BNAYXBQMT50.YYY4.XXXX.TV9V9.55553105.D111111.Z999999.K02.0396.XML #----------------------------------------------------------------------- if ($XML_FILE -match $PATTERN_RSRXML) { "HS_if1" gaudet_RSRXML } #else #{ # "else error" # dtcc_error #} }
  5. Hi BOFH_666, mal eine ganz blöde Frage, was passiert wenn es in einem XML File, 2 identische Lei's gibt, im Knoten aber ein anderer Inhalt ist. Dann überschreibt die eine Datei die andere. Kann Du es beim Script so machen, wenn eine identische bzw. schon vorhandene Leigefunden wird, das im dann schon erstelleten XML File, dieser Knoten hinzugefügt wird ? ? Anbei eine neues XML File Jetzt verlange ich wohl zuviel.... TestneuXML.XML
  6. Hallo, ich sage mal Danke. Werde jetzt mal den Code von BOfH_666 auserinandernehmen. Versuche ihn für mich zu dokumentieren und dann zu verstehen. Werde ihn noch was erweitern und melde mich dann. Nochmals ein RIESEN DANKE
  7. Hi, anbei ein neues xml File mit mehreren Knoten. Es sollte dann für jeden Knoten XML File erstellt werden. Ich teste gerade auch noch. TestXML.xml
  8. Hallo, es geht so für den Hausgebrauch, mein Problem ist das arbeiten mit XML Dateien Was ich wollte ist, die mitgelieferte XML Datei ( TestXML.XML als Beispiel )parsen, im unteren Script mit einem Vorschlag von Martin. Finde ich beim parsen eine LEI, dann eine neue XML Datei erstellen, mit dem Namen der gefundenen Lei. Den Knoten mit der gefundenen Lei in die erzeugt XML Datei einfügen. Das schaffe ich nicht Hier der Knoten mit der LEI 324400KX2BNAYXBQMT36 <TxId> <RptgCtrPty> <LEI>324400KX2BNAYXBQMT36</LEI> </RptgCtrPty> <OthrCtrPty> <LEI>OTHER</LEI> </OthrCtrPty> <UnqTradIdr>OTHER</UnqTradIdr> <MstrAgrmt> <TP> <TP>OTHER</TP> </TP> <OthrMstrAgrmtDtls>OTHER</OthrMstrAgrmtDtls> </MstrAgrmt> </TxId> Zugleich erstelle ich eine XML Datei $xml = [xml](Get-Content "C:\XMLDatei\TestXML.xml") Foreach ($Node in $xml.SctiesFincgRptgMssngCollReq.TxId.RptgCtrPty) { $Node.InnerXml #$Node.OuterXml #$OutFileId = $Node.LEI } # XML Dokument erstellen # Set The Formatting $xmlsettings = New-Object System.Xml.XmlWriterSettings $xmlsettings.Indent = $true $xmlsettings.IndentChars = " " # Erzeuge Filename vom Dokument $XmlWriter = [System.XML.XmlWriter]::Create("C:\XML_Test\TestXML.xml", $xmlsettings) # Schreibe XML-Deklaration - Struktur festlegen $xmlWriter.WriteStartDocument() #$xmlWriter.WriteProcessingInstruction("xml-stylesheet", "type='text/xsl' href='style.xsl'") # Start Wurzelelement $xmlWriter.WriteStartElement("SctiesFincgRptgMssngCollReq") $xmlWriter.WriteStartElement("TxId") # <-- Start <Object - TxID> $xmlWriter.WriteStartElement("RptgCtrPty") # <-- Start <SubObject - RptgCtrPty> $xmlWriter.WriteElementString("LEI", "324400KX2BNAYXBQMT37") $xmlWriter.WriteEndElement() # <-- Ende <SubObject> $xmlWriter.WriteStartElement("OthrCtrPty") # <-- Start <SubObject - OthrCtrPty> $xmlWriter.WriteElementString("LEI", "OTHER") $xmlWriter.WriteEndElement() # <-- Ende <SubObject> $xmlWriter.WriteElementString("UnqTradIdr", "OTHER") $xmlWriter.WriteStartElement("MstrAgrmt") # <-- Start <Object - MstrAgrmt> $xmlWriter.WriteStartElement("TP") # <-- Start <SubObject - TP> $xmlWriter.WriteElementString("TP", "OTHER") $xmlWriter.WriteEndElement() # <-- Ende <SubObject> $xmlWriter.WriteElementString("OthrMstrAgrmtDtls", "OTHER") $xmlWriter.WriteEndElement() # <-- Ende <SubObject> $xmlWriter.WriteEndElement() # <-- Ende <Object> # Beenden, finalisieren und schließen des XML-Dokument $xmlWriter.WriteEndDocument() $xmlWriter.Flush() $xmlWriter.Clos TestXML.xml
  9. Dann sagen wir es mal so, in Deinem Geburtsjahr habe ich meine Ausbildung begonnen, demnach bin ich kein alter Herr, sondern ein Greis.
  10. HM, bekomme immer hier einen Fehler. Muss mir mal den $Node anschauen, den ich mir geschrieben habe $OutFileId = $Node.TechRcrdId ERROR: In C:\DTCC TEST\Sta_Einlesen_Test.ps1:48 Zeichen:31 ERROR: + $OutFileId = $Node.TechRcrdId ERROR: + ~ ERROR: Unerwartetes Token "" in Ausdruck oder Anweisung. ERROR: + CategoryInfo : ParserError: (:) [], ParseException ERROR: + FullyQualifiedErrorId : UnexpectedToken ERROR: Hallo Nils, alte Herren ????? Du bezeichnest Dich als alter Herr ? Wenn Du möchtest bzw. willst, nenne mal Dein Alter. Dann kann ich was dazu sagen.
  11. Hi, war nicht ernst gemeint, ich freue mich das mir hier geholfen wird.
  12. Hallo, ich möchte mich bei daabm bedanken, hier im Forum kann ich was lernen. Zugleich möchte ich mich entschuldigen, für das Thema XML, weil es zu einem regen Schriftverkehr geführt hat Ich sage DANKE, für jede Anregung und Hilfe
  13. Hi, leider nicht. Ich werde jetzt wie folgt vorgehen. 1. Importdatei ( XML ) parsen nach Merkmal. 2. Neue Xml Dateien erstellen, nur mit den identifizierten Knoten, Merkmal im Dateinamen einfügen ( Dateiname umbenennen ) 3. Neue Dateien mit dem Excelshheet abgleichen, bei Treffer, Datei umbenennen, vorne User im Dateinamen Wenn das grob funktioniert, werde ich das Script verfeinern. Kämpfe mich gerade durch das parsen und erstellen einer neuen XML Datei ( Struktur )
  14. Hier mal die csv datei mit txt als endung. Ich werde mal mein Glück mit der xml erstellung versuchen, das ist der schwierigste teil. Zuordnung.txt
  15. Hi, das File wird dann automatisch verarbeitet Solange es xml Fomat hat Genau, (höchstens für Sadisten und Masochisten ) Das XML Format ist ja mein Problem Mein Problem ist es mit XLM umzugehen. Wenn man jetzt den Knoten identifiziert hat, wie erstelle ich dann für jeden Knoten ein XLM File, mit dem Knoten als Inhalt, wie oben beschrieben und setze die Nummer vorne als Namensbestandteil dran.
  16. Hallo, Du meinst dazu ? Was würde passieren, wenn man nur eine Datei zum validieren versenden würde? Vielleicht kann man das Aufsplitten in einzelne User-Dateien ja vermeiden, wenn man dem Validator nur einzelne User-Dateien verfüttert!? Die Dateien werden getrennt auf verschiedenen Rechnern erstellt und versendet. Gesammelt wird auf der Gegenseite, dann nur ein XML File erstellt. Hier mal eine Beispiel Exceldatei, man darf hier wohl keine csv Datei ablegen , also xlsx Zuordnung.xlsx
  17. es ist eine csv Datei. Leider wird für jeden Benutzer diese Datei zum Export erzeugt
  18. Hi, Der User kann damit seine Exportdatei mit der validierten Importdatei abgleichen. Die XML Files werden durch ein Programm erzeugt und versendet. Es kommt nur ein File zurück mit allen Antworten, darauf hat man keinen Einfluss Die Nummer für jeden User ist im Vorfeld festgelegt,
  19. Hi, wie soll ich das erklären, ich versuche es mal. Es wird ein XML File zur Validierung verschickt ( exportiert ), für jeden User ein File, es können 100 user sein. Als Antwort kommt eine Responesdatei ( Importdatei ) zurück. Jetzt kommt der Knackpunkt, in diesem File sind keine Userkennungen mehr drin. Sondern für jeden User gibt es eine Nummer die jedem User fest vergeben ist ( z.B. ERTHUTDREPxxSCDxxSFTRxxSFTxx487331 ). Daher muss ich das Importfile splitten, nach diesen Nummern und neu erstellen. Also beim schreiben des neuen Files, wird der Dateiname um diese besagte Nummer erweitert. Anhand der Nummer kann ich einen Abgleich mit einem Excelsheet vornehmen, so das jeder User sein eigenes Responsesfile bekommt. ich habe hier mal den Begriff User genommen, zur Erklärung
  20. Hallo, Danke für den Hinweis, ich hätte es jetzt so gemacht. Deine Lösung ist eleganter. $StatTradDataXmlData = [xml](Get-Content "D:\sample\test.xml") $node = $StatTradDataXmlData.SctiesFincgRptgTxStatRpt.TradeData $Statnames = @() foreach ($entry in $node) { $Statnames = $Statnames + $entry.Stat } Write-host $Statnames Ich möchte für jeden extrahierten Knoten ein neues XML File erstellen, wo nur der gefunden Knoten enthallten ist Als Beispiel: <?xml version="1.0"?> <SctiesFincgRptgTxStatRpt> <TradData> <Stat> <TechRcrdId>ERTHUTDREPxxSCDxxSFTRxxSFTxx487331</TechRcrdId> </Stat> </TradData> </SctiesFincgRptgTxStatRpt> Ja, XML ist für mich schwer, habe mich in der Zwischenzeit über den XML Aufbau etwas eingelesenen.
  21. Hallo zusammen, ich hoffe mir kann jemand einen Denkanstoß geben oder auch helfen, Scripting PowerShell. Ich habe eine XML Datei, dort sind mehrere Knoten vorhanden, Auszug aus der Datei: Ich meine mit Knoten: -<Stat> bis </Stat> -<SctiesFincgRptgTxStatRpt> -<TradData> -<Stat> <TechRcrdId>ERTHUTDREPxxSCDxxSFTRxxSFTxx487331</TechRcrdId> +<CtrPtyData> +<LnData> +<CollData> +<CtrctMod> </Stat> -<Stat> <TechRcrdId>WKTHUTDREPxxSCDxxSFTRxxSFTxx487335</TechRcrdId> +<CtrPtyData> +<LnData> +<CollData> +<CtrctMod> </Stat> -<Stat> <TechRcrdId>KRTHUTDEKDxxSCDxxSFTRxxSFTxx487339</TechRcrdId> +<CtrPtyData> +<LnData> +<CollData> +<CtrctMod> </Stat> Ich möchte die XML Datei nach allen Knoten durchsuchen, wenn einer gefunden wurde, soll dieser in einer neuen XML Datei abgespeichert werden. So das ich für jeden Knoten eine separate Datei bekomme. Zum durchsuchen der Datei, dachte ich an eine Schleife, aber meine XML Kenntnisse zum Aufbau sind wohl nicht gut genug. Bekomme noch keine Ergebnisse. Kann mir jemand bei dem oben geschrieben helfen ? $StatXmlData = [xml](Get-Content "D:\test.xml") $node = $StatXmlData.Backups.Stat $Statnames = @() foreach ($entry in $node) { $Statnames = $Statnames + $entry.TechRcrdId } Write-host $Statnames
  22. Hallo, ich bin wirklich blö….. Mit eurem Script konnte ich meinen Wunsch umsetzen. Mein Fehler war, dass ich euer Script im Funktionsblock eingesetzt habe, wo die Abarbeitung jedes einzelnen Files erfolgte. Ich habe euer Script jetzt an den Anfang des Funktionsaufrufes gesetzt, hier liegen alle Dateien gesammelt im Verzeichnis. Euer Scriptteil wird dann einmalig aufgerufen und alle Dateien werden abgearbeitet. Erst danach rufe ich meinen Funktionsblock auf. Einen riesen Dank, habe jetzt was dazugelernt und danke für Eure Hilfe
  23. Hallo, folgende Codierung. UTF-8. Die Datei sieht vom Inhalt wie folgt aus: 1TRANS20200128 100GTR XML Download Rep0001 10298310003 0000000016DTCCCDT 20200128 05:21 RDT 20200128 05:21 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> Damit die XML Strucktur wieder lesbar ist, muß die erste Zeile raus.
  24. Hm, also, wenn ich ein Verzeichnis habe, wo alle Dateien vorhanden sind, dann funktioniert MurdocX Script wunderbar. In meinem Script wird jede Datei auf den Dateinamen geprüft, gibt es eine Übereinstimmung mit einem Platzhalter, dann wird die Datei verschoben und umbenannt. An diesem Punkt setze ich euer Script ein. Move-Item -path $DTCC_ROOTFILE -Destination $DTCC_ACKNACKXML -Force Rename-Item -Path $DTCC_ACKNACKXMLFILE -NewName $ACKNACKXML_NEWFILE "Die Datei " + $DTCC_FILE + " wurde nach " + $DTCC_ACKNACKXML + " verschoben und umbenannt in: " + $ACKNACKXML_NEWFILE $file = "$DTCC_ROOT\*.xml" Get-ChildItem -Path $file -File -Filter *.xml | ForEach-Object { (Get-Content -Path $_.FullName | Select-Object -Skip 1) | Set-Content -Path $_.FullName -Encoding UTF8 } $TESTPATH_ACKNACKXMLFILE = Test-Path $DTCC_ACKNACKXMLNEWFILE if ($TESTPATH_ACKNACKXMLFILE -eq $TRUE) { Copy-Item -Path $DTCC_ACKNACKXMLNEWFILE -Destination $DTCC_SAMMELCOPY "Die Datei " + $ACKNACKXML_NEWFILE + " wurde kopiert nach " + $DTCC_SAMMELCOPY } Dabei kommt jetzt folgendes raus, die original Dateigröße ist 726, nach dem Scriptlauf sieht die Größe jetzt wie folgt aus: Datei1 wird zuerst überprüft und verschoben, dann Rename und dann kommt Euere Scriptteil zum Einsatz. Danach noch ein copy ins andere Verzeichnis jetzt wird Datei2 dann 3 dann 4 behandelt. Datei1 726 Datei2 606 Datei3 549 Datei4 482
×
×
  • Create New...