peter32
Goto Top

Powershell funktioniert nicht richtig beim Auslesen der letzten Zeile

Hallo,

mein code lautet:

@echo off & setlocal EnableDelayedExpansion
set Logfile=C:\testlogfile.log
set Outfile=C:\status.txt
powershell -Executionpolicy ByPass -Command "(gc '!Logfile!')[-1] | out-file '!Outfile!'"  
set /p "letztezeile="<"!Outfile!"  
echo letztezeile: !Letztezeile!
pause

Wieso erhalte ich als Ausgabe:
letztezeile: ÿþ1
Drcken Sie eine beliebige Taste . . . 

Kann ich eigentlich auch die letzte Zeile direkt aus der powershell als Variable "letztezeile" einlesen? Bestimmt oder?

Danke im Voraus!


LG
Peter

Content-Key: 314754

Url: https://administrator.de/contentid/314754

Printed on: April 24, 2024 at 00:04 o'clock

Member: colinardo
colinardo Sep 08, 2016 updated at 17:33:09 (UTC)
Goto Top
Hallo Peter,
der Grund ist das deine Batch per Default in Codepage 850 Kodierung läuft und keine Umlaute etc versteht. Außerdem muss man bei out-file unter Umständen auch die Kodierung als Parameter angeben.

Umlautunterstützung bekommst du mit einem
chcp 1252 >nul
am Anfang deines Codes.
Kann ich eigentlich auch die letzte Zeile direkt aus der powershell als Variable "letztezeile" einlesen?
Sicher, wie immer ist die FOR-Schleife dein Freund! face-smile Damit kannst du sämtliche Ausgaben von Programmen erfassen ohne immer den Umweg einer Datei zu gehen.

Zusammengefasst also:
@echo off & setlocal
chcp 1252 >nul
set "Logfile=C:\testlogfile.log"  
for /f "delims=" %%a in ('powershell -Executionpolicy ByPass -Command "(gc '%Logfile%')[-1]"') do set "letztezeile=%%a"  

Grüße Uwe

p.s. Les dir doch bitte mal das Tutorial zur FOR-Schleife durch, damit du die FOR-Schleife endlich verstehst anstatt hier nur Code zu kopieren den man dir hier vorsetzt.
Member: Peter32
Peter32 Sep 08, 2016 at 18:03:42 (UTC)
Goto Top
OK aber ich verstehe nicht ganz wieso ich mir diese letztezeile nicht in eine separate text datei ausgeben kann, ohne dass es zu problemen kommt? sie ist immer leer?
Member: colinardo
Solution colinardo Sep 08, 2016, updated at Sep 09, 2016 at 07:02:38 (UTC)
Goto Top
Zitat von @Peter32:

OK aber ich verstehe nicht ganz wieso ich mir diese letztezeile nicht in eine separate text datei ausgeben kann, ohne dass es zu problemen kommt.
Sicher kannst du das, das habe ich ja nicht behauptet, und bleibt dir überlassen ob du sie extra in eine Datei schreiben willst.

sie ist immer leer?
Wenn sie leer ist ist hat deine letzte Zeile nur ein Leerzeichen bzw. keinen Wert oder nur eine Leerzeile, so einfach ist das. Wenn das so sein sollte und das nicht gewünscht ist lässt sich das auch abfangen.
Das hier ignoriert alle Zeilen die nur "nicht sichtbare" Zeichen enthalten und nimmt die letzte Zeile die wirklich relevanten Inhalt hat.
powershell -Executionpolicy ByPass -Command "(gc '%logfile%' | ?{$_ -notmatch '^\s*$'})[-1] | set-content '%outfile%'"  

Zusätzlich solltest du das Encoding der Logdatei nicht vergessen, das du ebenfalls überprüfen solltest.

Es gibt viele Arten in der Powershell Inhalt in Dateien zu schreiben:
Unter anderem gibt es noch diese Varianten (min. PS 3.0):
powershell -Executionpolicy ByPass -Command "(gc '%Logfile%' -tail 1 | set-content '%Outfile%'"   
powershell -Executionpolicy ByPass -Command "gc -literalpath '%Logfile%' -tail 1 >'%Outfile%'"   
usw.

Du kannst den PS Code (alles was in den Anführungszeichen steht) selber auch in der ISE separat testen und experimentieren. Dann natürlich die Batchvariablen durch richtige Pfade ersetzen. Also beschäftige dich mehr mit der PS oder lass es.

Bitte lese doch zwischendurch auch mal in der Powershell-Doku da kannst du das alles schön nachlesen.

Das ist hier immerhin ein Admin-Forum, da kann man so was von einem erwarten.

Vor dem Verstehen kommt Lesen. Und das empfehle ich dir eindringlichst. Denn mit copy n' paste kommst du in Zukunft in diesem Bereich nicht weit.

Grüße und viel Erfolg
Uwe
Member: colinardo
colinardo Sep 09, 2016 updated at 07:17:46 (UTC)
Goto Top
Sehe deinen Fehler, du verwendest delayed expansion... die Ausrufezeichen werden im PS Code falsch interpretiert. Verwende kein DelayedExpansion das brauchst du dort sowieso nicht, siehe meine Code-Beispiele oben.
Member: Peter32
Peter32 Sep 09, 2016 updated at 10:39:30 (UTC)
Goto Top
Zitat von @colinardo:

> powershell -Executionpolicy ByPass -Command "(gc '%logfile%' | ?{$_ -notmatch '^\s*$'})[-1] | set-content '%outfile%'"  


Danke das war die Lösung!