Jump to content

epsodus

Newbie
  • Content Count

    28
  • Joined

  • Last visited

Community Reputation

3 Neutral

About epsodus

  • Rank
    Newbie

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  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.
×
×
  • Create New...