Jump to content
epsodus

1 Zeile aus Datei entfernen, mit Powershell

Recommended Posts

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

Share this post


Link to post
Share on other sites
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 :-) 

Edited by MurdocX

Share this post


Link to post
Share on other sites
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:

Edited by BOfH_666

Share this post


Link to post
Share on other sites
vor 12 Minuten schrieb BOfH_666:

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

Schneller ist nicht immer besser. Ich hab schon einen Fehler bei mir gefunden :lool:

Share this post


Link to post
Share on other sites
vor 4 Minuten schrieb MurdocX:

...  Ich hab schon einen Fehler bei mir gefunden :lool:

Da kann der OP gleich ein bissl Debugging üben ... super.  :grin3::aha2::hmmm::lol3::thumb1:

Share this post


Link to post
Share on other sites

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  

Share this post


Link to post
Share on other sites

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

 

Share this post


Link to post
Share on other sites

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

 

Share this post


Link to post
Share on other sites

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

 

Share this post


Link to post
Share on other sites
vor 3 Minuten schrieb NilsK:

Ich nehme mal an, dass die PowerShell den ANSI-Text meiner Beispieldateien implizit in Unicode wandelt.

Set-Content und Out-File nehmen default, laut Microsoft Zitat: "The default value is UTF8NoBOM". Das bestätigt deine Annahme.

 

@epsodus Welche Kodierungen haben deine XML-Dateien?

Share this post


Link to post
Share on other sites

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

 

 

Share this post


Link to post
Share on other sites
Gerade eben schrieb NilsK:

und das sagt uns jetzt was?

.... das grüble ich auch grade ...  ;-)   ... es wäre vielleicht eine gute Idee, nochmal strukturiert zu erklären, was Du eigentlich machen willst und warum.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


Werbepartner:



×
×
  • Create New...