peter32
Goto Top

Sonderzeichen Fehler aus Textdatei vermeiden

Hallo,

ich habe eine einzige Textdatei mit unbekanntem Namen Im Ordner "temp", mit dem Inhalt:

Zeile1
Zeile2
...
Vorletzte Zeile www.website.de/?offset=123456&max=500&sort=relevanz&other/weiteres
Letzte Zeile www.website.de/?offset=789012&max=500&sort=relevanz&other/weiteres

Wenn ich mir nun die letzte Zeile mit dem Code

set "LetzteZeile="   
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "temp\*.*"') do set "LetzteZeile=%%j"   
echo %LetzteZeile%>letzte Zeile.txt

ausgeben lasse in "letzte Zeile.txt", dann bekomme ich den Fehler:

Der Befehl "max" ist entweder falsch geschrieben oder  
konnte nicht gefunden werden.
=relevanzDas System kann die angegebene Datei nicht finden.

Ich vermute stark, dass das mit den Sonderzeichen "&", etc. abhängt.

Wie kann ich diesen Fehler vermeiden?

Vielen Dank im Voraus und LG
Peter

Content-Key: 314058

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

Printed on: April 23, 2024 at 14:04 o'clock

Member: rubberman
Solution rubberman Aug 31, 2016 at 19:08:32 (UTC)
Goto Top
Hallo Peter,

ich gehe davon aus, den String in Anführungszeichen zu setzen kommt nicht infrage?
Alternativ
setlocal EnableDelayedExpansion
>"letzte Zeile.txt" echo !LetzteZeile!  
endlocal
Grüße
rubberman
Member: Friemler
Solution Friemler Aug 31, 2016 updated at 21:04:09 (UTC)
Goto Top
Hallo Peter,

da fallen mir die folgenden beiden Möglichkeiten ein:

1. Da Dich ja nur die letzte Zeile interessiert, kannst Du die Zieldatei immer wieder überschreiben. Der Inhalt der Laufvariablen von FOR-Schleifen wird nicht interpretiert und ist somit "sonderzeichenfest".
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "temp\*.*"') do (  
  >"letzte Zeile.txt" echo %%j  
) 


2. Alternative Möglichkeit für die Ausgabe; die Batch-Variable ist zwar in Anführungszeichen eingeschlossen, diese werden aber nicht in die Datei geschrieben.
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "temp\*.*"') do (  
  set "LetzteZeile=%%j"  
) 

>"letzte Zeile.txt" (set /p "=%LetzteZeile%" < NUL & echo.)  


Grüße
Friemler
Member: Peter32
Peter32 Sep 02, 2016 at 11:09:05 (UTC)
Goto Top
Danke face-smile
Member: Peter32
Peter32 Sep 02, 2016 at 14:18:43 (UTC)
Goto Top
Hallo,

leider dauert dies sehr sehr lange, wenn die Datei sehr groß ist (z.B. 1-10mb)... gibt es einen schnelleren Weg? face-smile
Mitglied: 129813
Solution 129813 Sep 02, 2016 updated at 14:28:01 (UTC)
Goto Top
gibt es einen schnelleren Weg?
@echo off
powershell -Executionpolicy ByPass -Command "gc 'C:\temp\*.*' -tail 1 | out-file 'C:\letztezeile.txt'"  
Regards
Member: Friemler
Solution Friemler Sep 02, 2016 at 15:57:26 (UTC)
Goto Top
Hallo Peter,

da die Lösung von @129813 Powershell 3.0 voraussetzt, schlage ich noch folgendes vor:
for %%f in ("temp\*.*") do (  
  for /f "usebackq tokens=* delims=" %%i in ("%%~f") do (  
    set "LetzteZeile=%%i"  
  ) 
)

>"letzte Zeile.txt" (set /p "=%LetzteZeile%" < NUL & echo.)  

Der Aufruf von FINDSTR innerhalb der FOR-Klammer war ja komplett unnötig, da Du die Zeilennummer sowieso ignorierst, die von FINDSTR wegen dem Parameter /N vor die gefundenen Zeilen (also alle in der Datei) gesetzt wird.

Benötigt für eine Datei mit 1000000 Zeilen ca. 10 Sekunden.

Grüße
Friemler
Mitglied: 129813
Solution 129813 Sep 02, 2016 updated at 16:32:21 (UTC)
Goto Top
Zitat von @Friemler:
da die Lösung von @129813 Powershell 3.0 voraussetzt
Small change and it's compatible with every powershell version face-wink
powershell -Executionpolicy ByPass -Command "(gc 'C:\temp\*.*')[-1] | out-file 'C:\letztezeile.txt'"  
Regards
Member: Friemler
Solution Friemler Sep 02, 2016 at 16:21:01 (UTC)
Goto Top
[OT]

Hello highload,

Powershell is like the cockpit of a modern car: A multifunctional menu driven touchscreen and additionally 50 knobs and switches at minimum. You can only handle them if you spend two days for reading the manual and another two weeks to train yourself in operating all this stuff. In the end you find yourself completely confused and you realize that you only need one percent of all the functionallity the car offers for your daily requirements.

BTW: The shortest is not the best (said the bitch in the brothel). face-wink

Regards
Friemler

[/OT]
Mitglied: 129813
Solution 129813 Sep 02, 2016 updated at 16:50:18 (UTC)
Goto Top
In the end you find yourself completely confused
? face-smile I don't think, the for-loop in batch for example, is that much easier for absolute beginners than in PS, not talking about the inconsistencies. I don't think PS is hard to learn, the problem is that people are creatures of habit, and don't like new things they don't know already.
and you realize that you only need one percent of all the functionallity the car offers for your daily requirements.
But i don't need 100 additional different external tools like in batch when i have a complete programming language (.NET) in my back face-smile

If performance is the main target I would never use windows anyway, instead using my brothers sed, grep, tail or awk face-smile

But everyone decides itself anyway ...

Have a nice weekend
highload
Member: Friemler
Solution Friemler Sep 02, 2016, updated at Sep 03, 2016 at 18:18:29 (UTC)
Goto Top
[OT]

My comment wasn't meant to be that serious. It was a reply to your "In Powershell it is shorter again" statement (which you deleted meanwhile).

Of course, Powershell is a powerfull language and batchscript and its design was the work of a dumb trainee at Microsoft. But for such simple tasks like requested by the TO it is good enough.

I'm a Delphi developer and don't have the requirement to do things with scripts that much. So, Batchscript sufficently fits my needs and using Powershell is like throwing a thermonuclear bomb if I'm in a hassle with my neighbour.

A nice weekend for you too.
Friemler

[/OT]
Member: Peter32
Peter32 Sep 05, 2016 at 14:41:38 (UTC)
Goto Top
Danke ! Das funktioniert nun viel schneller face-smile
Member: Peter32
Peter32 Sep 05, 2016 at 14:58:32 (UTC)
Goto Top
if exist "prozesse.txt" del "prozesse.txt" /s /q >NUL  
tasklist | find /i "programm1.exe">>"prozesse.txt"  
tasklist | find /i "programm2.exe">>"prozesse.txt"  
for /f "tokens=2 delims==" %%a in ('wmic os get FreePhysicalMemory /format:list') do set "freeram=%%a"  

achja wenn wir es gerade von performance haben...
weiß einer warum mein o.g. code manchmal sogar 10 minuten dauert? und wie man das eventuell beschleunigen kann?
Member: Biber
Solution Biber Sep 05, 2016 updated at 15:33:14 (UTC)
Goto Top
Moin Peter32,


Zitat von @Peter32:

achja wenn wir es gerade von performance haben...
Elegante Überleitung.
Und auch viel passender als "Was ich letzte Nacht geträumt habe" oder "wie schon die alten Ägypter sagten".

Nichtsdestotrotz: ich hatte schon vor wenigen Tagen explizit DICH darum gebeten, doch nicht in Beiträgen zur einer bestimmten Frage plötzlich ein vollkommen anderes Thema aufzureissen, wenn die Frage beantwortet ist oder nicht mehr so wichtig erscheint.

Weil:
  • Menschen, die vielleicht eine Lösung zu dem Titel-Thema erhoffen, könnten enttäuscht werden
  • Menschen, die vielleicht eine Antwort auf die neue Frage wissen, werden diese Frage nie lesen in einem gelösten Thread mit anderem Titel

weiß einer warum mein o.g. code manchmal sogar 10 minuten dauert? und wie man das eventuell beschleunigen kann?
Nicht wirklich . Zwar scheinen die ersten 3 Zeilen nix mit der 4ten Zeile zu tun zu haben, aber es ist nichts dabei, was 10 Mnuten dauern kann,

Es sei denn:
  • in deinem Arbeitsverzeichnis (in dem der Batch läuft) sind mehr als 40000 Dateien
  • die Festplatte/Partition ist so voll, dass selbst kleinste Directory-Änderungen Stress verursachen
  • der Batch heisst "tasklist.bat" oder tasklist.cmd und braucht deshalb ein büschen länger
  • der Wert %freeram%, den du setzt, beträgt weniger als 172 Byte

Kürzer ohne inhaltliche Änderung ginge es jedenfalls so:
tasklist | findstr /i "programm1.exe programm2.exe">"prozesse.txt"  
for /f  %%a in ('wmic os get FreePhysicalMemory') do set "freeram=%%a"  

Vielleicht drücken wir es damit unter 9 Minuten.
Was diese beiden Zeilen allerdings miteinander zu tun haben (falls das der ganze Batch ist) vermag ich nicht zu deuten.

Grüße
Biber
Member: Peter32
Peter32 Sep 06, 2016 at 13:07:32 (UTC)
Goto Top
Hallo Biber,

danke für deinen Beitrag!

Das nächste mal werde ich darauf achten, eine neue Frage zu starten - habe ich dieses mal nicht dran gedacht und da hast du auch wirklich recht, sorry.

Ich werde deinen Code einmal ausprobieren - Danke!

Was die miteinander zutun haben, falls es dich wirklich interessiert:
Ich brauche eine simple Batch, die mir sämtliche Prozesse auflistet mit dem Programm X und im selben Moment den Freien Arbeitsspeicher dazu anzeigt. Das ganze Programm ist natürlich viel komplexer und dieses ist nur ein kleiner Teil davon.

LG
Peter
Member: Peter32
Peter32 Sep 08, 2016 updated at 17:20:56 (UTC)
Goto Top
Hello highload,


Zitat von @129813:

> powershell -Executionpolicy ByPass -Command "(gc 'C:\temp\*.*')[-1] | out-file 'C:\letztezeile.txt'"  
> 


thanks for your powershell code!

I tried it but I get troubles with it so I opened a new thread here:
Powershell funktioniert nicht richtig beim Auslesen der letzten Zeile
Mitglied: 129813
129813 Sep 08, 2016 updated at 19:45:49 (UTC)
Goto Top
Totally agree with @colinardo in the other thread !
You step on my nerves, my friend face-sad

START LEARNING POWERSHELL -> NOW

And don't nerve the people here with these simple things you can read in any documentation!!