2017-06-19 5 views
0

Mit Powershell v2, das aus einer Batch-Datei aufgerufen wird, möchte ich jede CRLF in einer Datei mit nur einem LF ersetzen. Wenn eine Datei nur LF ohne CR hat, möchte ich alle LF in Ruhe lassen.Powershell v2: CRLF durch LF ersetzen

Ich möchte keine abschließende CRLF in der resultierenden Datei, wenn möglich.

Ich fand this question here on Stack Overflow, das scheint eine enge Übereinstimmung sein, aber es gibt keine Powershell-Version Anforderung, noch gibt es die anderen oben genannten Kriterien. Daher diese Frage.

Die akzeptierte Antwort auf diese Frage empfiehlt diesen Code:

$in = "C:\Users\abc\Desktop\File\abc.txt" 
$out = "C:\Users\abc\Desktop\File\abc-out.txt" 
(Get-Content $in) -join "`n" > $out 

ich es leicht modifiziert und angepasst es aus einer Batch-Datei zu arbeiten, zu lesen:

powershell -Command "(Get-Content file1.txt) -join '`n' > file2.txt" 

Leider ist dies funktioniert nicht. Alle LFs werden in die Zeichenfolge `n konvertiert.

Wie kann ich dies funktioniert?

Antwort

1

, die vor mir sind rechts sollten Sie "`n" verwenden

Bei der Verwendung von Powershell ich es die folgenden Schalter empfehlen Ausführung:
- noninteractive zeigen Sie nicht mit der Powershell
interagieren wollen - NoProfile - die Dinge erheblich (überspringt das Belastungsprofil) beschleunigt
- ExecutionPolicy Bypass - umgeht Sicherheitsprobleme, wenn Sie auf Firmen Umwelt

Edit:

Sorry über den Fehler, den Sie erwähnten. Ich habe jetzt eine PowerShell 2.0-Testeinrichtung.

Die behobene Ihr Beispiel (der Fehler war, dass Sie die doppelten Anführungszeichen entgehen müssen, weil die powershell.exe sie interpretiert). Dieser Ansatz funktioniert nicht vollständig, da es CRLF am Ende der Datei verläßt:

powershell.exe -noninteractive -NoProfile -ExecutionPolicy Bypass -Command "& {(Get-Content file_crlf.txt) -join \"`n\" > file_lfonly.txt};" 

jedoch die völlig richtige Lösung anderen Ansatz muss (über IO.file Klasse):

powershell.exe -noninteractive -NoProfile -ExecutionPolicy Bypass -Command "& {[IO.File]::WriteAllText('file_lfonly.txt', ([IO.File]::ReadAllText('file_crlf.txt') -replace \"`r`n\", \"`n\"))};" 

Die komplett wandelt Ihre CRLF in LF um. Nur kleine Warnung, konvertiert es in ASCII nicht Unicode (außerhalb des Umfangs dieser Frage).

Alle Beispiele werden jetzt mit PowerShell v2.0.50727 getestet.

+0

Danke! Tolle Information! Warum haben Sie das führende kaufmännische Und-Zeichen hinzugefügt, den Befehl in geschweifte Klammern eingeschlossen und das abschließende Semikolon hinzugefügt? – RockPaperLizard

+0

Hmmm .... Ich erhalte den folgenden Fehler: ** Sie müssen einen Wertausdruck auf der rechten Seite des '-join'-Operators angeben. ** – RockPaperLizard

+1

Entschuldigung. Ich entkam den Anführungszeichen mit 'aber powershell.exe benötigt ein \, wenn von Batch-Datei ausgeführt. Ich habe jetzt alle Beispiele richtig getestet. – tukan

0

Ein paar Dinge:

  • Apostrophe ' wörtliche sind - " doppelte Anführungszeichen verwenden, so dass Powershell weiß, dass Sie neue Linie bedeuten

  • Wenn Sie doppelte Anführungszeichen in doppelte Anführungszeichen entkommen müssen, verwenden "" oder `“

bearbeiten:

Ihr ursprünglicher Beitrag funktionierte für mich, also sieht das so aus, dass es mit PowerShell 5 v 2 verwandt wird, und ich kann die Lösung nicht testen. Statt Escape-Zeichen, hier ist eine Lösung mit Skript:

powershell -Command {(Get-Content file1.txt) -join "`n" > file2.txt} 

Es ist erwähnenswert, dass dies trivial in Notepad ++ und kann für mehrere Dateien auf einmal durchgeführt werden:

New line replace in Notepad++

+0

Irgendetwas läuft schief, wenn ich das versuche. Ich erhalte den Fehler ** Sie müssen einen Wertausdruck auf der rechten Seite des '-join'-Operators ** angeben. Können Sie die Codezeile angeben, die ich ausschneiden und einfügen kann, um zu sehen, was ich falsch mache? Denken Sie daran, dass es mit Powershell v2 funktionieren muss. – RockPaperLizard

+0

Vielen Dank für das Update! :) Wenn ich es versuche, bekomme ich die schließende geschweifte Klammer an den Ausgabedateinamen angehängt. – RockPaperLizard

+0

@RockPaperLizard Np! Ersetzen Sie 'file2.txt' durch' 'file2.txt" 'oder'> 'durch das eingebaute' | Out-File' – gms0ulman

Verwandte Themen