Jump to content

1 Zeile aus Datei entfernen, mit Powershell


Direkt zur Lösung Gelöst von epsodus,
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Hallo zusammen,

ich beschäftige mich noch nicht lange mit PowerShell und habe jetzt ein Problem, vielleicht kann mir jemand helfen.

 

Ich habe in einem Verzeichnis mehrere Dateien, mal 10 oder auch mal mehr. In diesen Dateien möchte ich die erste Zeile entfernen.

 

dazu verwende ich den folgenden Code:

$file = "$Test_ROOT\*.xml"
(Get-Content $file | Select-Object -Skip 1) | Set-Content $file

Das funktioniert, wenn im Verzeichnis eine Datei liegt. Sind es mehrere, dann werden die Dateien vom Inhalt größer.

es sieht so aus, als wenn der Inhalt der vorhergehenden Datei mit eingefügt wird.

 

kann mkir jemand dazu etwas sagen oder helfen ?

 

MfG. Volker

Link zu diesem Kommentar
Get-ChildItem -Path $Test_ROOT -File -Filter *.xml |
	ForEach-Object { 
  		(Get-Content -Path $_.FullName | Select-Object -Skip 1) | Set-Content -Path $_.FullName -Encoding UTF8
	}

Ich würde hier mal mit ForEach-Objekt arbeiten und für die Auflistung der Dateien Get-ChildItem.

 

Edit:

Ausgebessert :-) 

bearbeitet von MurdocX
Link zu diesem Kommentar
Get-ChildItem -Path $Test_ROOT -Filter *.xml |
    ForEach-Object {
        $ContentOhneErsteZeile = Get-Content -Path $_.FullName | Select-Object -Skip 1
        $ContentOhneErsteZeile | Out-File $_.FullName
    }

.... sollte reichen ...

 

Da XML-Dateien aber eigentlich keine einfachen Text-Dateien sondern strukturierte Daten sind, sollte man sie normalerweise auch als solche behandeln.  ;-)

 

Ooops ... der Jan war wieder schneller  :shock2:

bearbeitet von BOfH_666
Link zu diesem Kommentar

Hallo,

 

erst einmal Danke.

 

ich habe jetzt folgendes mal getestet.

$file = "c:\Power"
Get-ChildItem -Path $file -Filter *.xml |
ForEach-Object {
	$ContentOhneErsteZeile = Get-Content -Path $_.FullName | Select-Object -Skip 1
	$ContentOhneErsteZeile | Out-File $_.FullName
}

Dabei kommt folgendes raus:

Originalfile:  Testfile1.xml     Größe:726     und     Testfile2.xml   Größe:726

nach dem Script:

                    Testfile1.xml     Größe: 1208   und    Testfile2.xml   Größe: 1208

 

Das Ergebnis ist wie vorher  

Link zu diesem Kommentar

Moin,

 

hier tut Olafs Code, was er soll. Vielleicht kommen wir den Dingen auf die Spur, wenn du einen Trockenlauf machst und die Inhalte erst mal nur im Fenster ausgibst:

 

Get-ChildItem -Path $Test_ROOT -Filter *.txt |
    ForEach-Object {
      $ContentOhneErsteZeile = Get-Content -Path $_.FullName | Select-Object -Skip 1
      $_.FullName  
      $ContentOhneErsteZeile 
      '****** '
    }

Gruß, Nils

 

Link zu diesem Kommentar

Hallo,

 

jetzt bin ich etwas sprachlos. Benutze ich Olafs Code, dann ist es wie oben beschrieben. Benutze ich Dein Script, mit Ausgabe im Fenster, dann sieht es richtig aus.


 

>> Running (powertest.ps1) Script...
>> Platform: V5 64Bit (STA)
C:\Power\Testfile1.xml
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:auth.031.001.01">
    <FinInstrmRptgStsAdvc>
        <StsAdvc>
            <MsgRptIdr>TH308xx353602</MsgRptIdr>
            <MsgSts>
                <Sts>CRPT</Sts>
                <VldtnRule>
                    <Id>Error in processing the submission: The end-tag for element type "UnitPric" must end with a '>' delimiter.</Id>
                </VldtnRule>
                <MsgDt>2020-01-28</MsgDt>
            </MsgSts>
        </StsAdvc>
    </FinInstrmRptgStsAdvc>
</Document>
******
C:\Power\Testfile2.xml
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:auth.031.001.01">
    <FinInstrmRptgStsAdvc>
        <StsAdvc>
            <MsgRptIdr>TH308xx353602</MsgRptIdr>
            <MsgSts>
                <Sts>CRPT</Sts>
                <VldtnRule>
                    <Id>Error in processing the submission: The end-tag for element type "UnitPric" must end with a '>' delimiter.</Id>
                </VldtnRule>
                <MsgDt>2020-01-28</MsgDt>
            </MsgSts>
        </StsAdvc>
    </FinInstrmRptgStsAdvc>
</Document>
******

*** PowerShell Script finished. ***
>> Execution time: < 1 second
>> Script Ended

 

Link zu diesem Kommentar

Moin,

 

ich habe "mein Skript" (das ja Olafs ist) mal um eine Ausgabe in eine Datei erweitert (also im Prinzip Olafs Ausgabezeile wieder eingefügt). Da funktioniert es genauso und tut, was es soll: Der Inhalt der Datei ist ohne die erste Zeile drin.

 

Allerdings: Die Dateigröße ist verdoppelt. Ich nehme mal an, dass die PowerShell den ANSI-Text meiner Beispieldateien implizit in Unicode wandelt. Das wird man sicher auch beeinflussen können, dazu fehlt mir aber die Zeit.

Kann es sein, dass es bei dir in Wirklichkeit auch so ist?

 

Gruß, Nils

 

Link zu diesem Kommentar

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

 

 

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...