michael-24
Goto Top

Leerzeichen am Anfang und Ende löschen

Hallo zusammen,

ich habe bereits einen über 4 Jahre alten Eintrag hier gefunden, was sich mit diesem Thema beschäftigt.

Per Batch Leerzeichen am Anfang und Ende einer TXT entfernen

Ich weiss nicht, warum der Thread nicht nach oben hüpft. Ich schreib hier mal einen neuen Beitrag sonst glaub ich bekomme ich keine Antwort auf einen 4 Jahre alten Beitrag.

Sorry, wenn ich da was falsch gemacht haben sollte. Normal kenne ich das nur so, das der Beitrag wieder oben eingereiht wird, wenn wieder eine neue Antwort vorhanden ist.

Gruß
Michael

Content-ID: 285293

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

Ausgedruckt am: 21.11.2024 um 23:11 Uhr

122990
Lösung 122990 11.10.2015 aktualisiert um 20:08:12 Uhr
Goto Top
Moin,
alte Threads aufwärmen machen wir hier nicht, auch im Sinne des TOs.

Guckst du hier, und feddich ....
powershell -ExecutionPolicy Bypass -Command "(gc 'c:\datei.txt' | Out-String) -replace '^\s*(.*)\s*$','$1' | set-content 'c:\datei.txt'"  

Gruß grexit
Michael-24
Michael-24 11.10.2015 um 20:08:44 Uhr
Goto Top
Vielen Dank,

aber ich habe keine Powershell sondern eine 600 Zeile Batchdatei face-wink
122990
122990 11.10.2015 aktualisiert um 20:17:45 Uhr
Goto Top
aber ich habe keine Powershell sondern eine 600 Zeile Batchdatei
Ist doch Wurscht, die Zeile kannst du so wie sie oben steht problemlos in deine Batch einfügen, deswegen habe ich sie ja so geschrieben face-wink oder fackelst du das ganze unter einem XP ab ??

Aber wenn's schon gelöst is, gut ...

Dann schönen Sonntag noch.

grexit
Michael-24
Michael-24 11.10.2015 um 20:24:17 Uhr
Goto Top
Nein ist noch nicht gelöst. Ich habe nur auf "Zur Lösung beigetragen" gedrückt face-smile Ich bin nicht so oft hier.

Aha, die Batch wird in der WinPE Umgebung aufgerufen. Funktioniert das hier auch?
rubberman
rubberman 11.10.2015 aktualisiert um 20:31:55 Uhr
Goto Top
Hallo Michael,

vor ein paar Jahren hab ich mal ein Makro zu diesem Zweck geschrieben.
@echo off &setlocal DisableDelayedExpansion
::Linefeed
set ^"LF=^  

^" EMPTY LINE ABOVE IS CRITICAL!  
set ^"\n=^^^%LF%%LF%^%LF%%LF%^^"  

::%$TRIM% strVar [charVar] -- macro for trimming both left and right
set $Trim=for /l %%I in (1 1 2) do if %%I==2 (%\n%
  set "_spcs= "%\n%  
  for /f "tokens=1,2" %%J in ("!_arg!") do (%\n%  
    set "_str=!%%J!"%\n%  
    if "%%~K" neq "" if defined %%~K set "_spcs=!%%K:~0,1!"%\n%  
    for /l %%i in (1 1 12) do set "_spcs=!_spcs!!_spcs!"%\n%  
    set /a "k=4096"%\n%  
    for /l %%j in (1 1 13) do (%\n%
      if defined _str for %%k in (!k!) do (%\n%
        if "!_str:~-%%k!"=="!_spcs:~-%%k!" set "_str=!_str:~0,-%%k!"%\n%  
        if "!_str:~0,%%k!"=="!_spcs:~-%%k!" set "_str=!_str:~%%k!"%\n%  
        set /a "k/=2"%\n%  
      )%\n%
    )%\n%
    if defined _str (%\n%
      if not defined _notDelayed (%\n%
        set "_str=!_str:^=^^!"%\n%  
        set "_str=!_str:"=""Q!^"%\n%  
        call set "_str=%%^_str:^!=""E^!%%" ! %\n%  
        set "_str=!_str:""E=^!"%\n%  
        set "_str=!_str:""Q="!^"%\n%  
      )%\n%
      for /f ^^^"eol^^=^^^%LF%%LF%^%LF%%LF%^^ delims^^=^^^" %%k in ("!_str!") do endlocal^&endlocal^&set "%%J=%%k"!%\n%  
    ) else endlocal^&endlocal^&set "%%J="%\n%  
  )%\n%
) else setlocal^&set "_notDelayed=!"^&setlocal EnableDelayedExpansion^&set _arg=  

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

for /f "delims=" %%i in ('type "datei.txt"^|findstr /n "^"') do (  
  set "ln=%%i"  
  setlocal EnableDelayedExpansion
  set "ln=!ln:*:=!"  
  %$TRIM% ln
  echo(!ln!
  endlocal
)
pause

Achte darauf, dass hinter dem ^ in Zeile 3 kein Leerzeichen steht und dass Zeile 4 wirklich leer ist!

Grüße
rubberman
122990
122990 11.10.2015 um 20:31:29 Uhr
Goto Top
Aha, die Batch wird in der WinPE Umgebung aufgerufen. Funktioniert das hier auch?

Wenn du die PS Komponenten in dein PE mit einbaust ja ...
https://technet.microsoft.com/en-us/library/dn605289.aspx
Michael-24
Michael-24 11.10.2015 um 21:25:41 Uhr
Goto Top
Boah, von einem drei Zeiler auf dieses Skript, nur das die Leerzeichen am Anfang entfernt werden können, die auch Steuerzeichen enthalten... Dann schneid ich einfach die zwei Leerzeichen so ab. Hoffentlich bleibts in neueren Versionen von Diskpart auch bei 2 Leerzeichen. Dann läuft das Skript auch weiterhin.
AnkhMorpork
AnkhMorpork 12.10.2015 um 14:55:21 Uhr
Goto Top
Wenn dir die PS-Lösung von grexit nicht mundet, bietet sich die Trim-Funktion an.
Aber PS willst du ja scheinbar nicht ...

Zum lesen take that:
http://blogs.technet.com/b/heyscriptingguy/archive/2014/07/18/trim-your ...
Michael-24
Michael-24 12.10.2015 um 15:13:28 Uhr
Goto Top
::-----snipp TrimALine.cmd
@echo off & @(for /f "delims=" %%i in (d:\temp\bsp.txt) do @call :trimthis %%i ) & goto :eof  
:trimThis
@(echo [%*]) & goto :eof
::-----snapp TrimALine.cmd


Durchschaut, Powershell schmeckt mir wirklich nicht. Hab jetzt alles mit der normalen Batch gelöst.

Warum hat der Code oben Probleme mit einem ( oder )? Kannst ma nicht irgendwo noch ^ machen? face-smile

Der Link bezieht sich auch wieder auf die PowerShell, aber trotzdem vielen Dank.
rubberman
rubberman 12.10.2015 um 21:13:01 Uhr
Goto Top
Boah, von einem drei Zeiler auf dieses Skript
Ist doch völlig egal, du hast es nicht mal schreiben müssen. Brauchst es lediglich zu kopieren. Keine Ahnung wo du das Problem siehst.

Grüße
rubberman
rubberman
rubberman 12.10.2015 aktualisiert um 21:22:19 Uhr
Goto Top
Warum hat der Code oben Probleme mit einem ( oder )?
Liegt an @Biber 's exzessivem Setzen von Klammerblöcken, die dazu führen, dass schließende Klammern im Text als schließende Klammern im Code interpretiert werden.
@echo off
for /f "usebackq delims=" %%i in ("d:\temp\bsp.txt") do call :trimthis %%i  
pause
goto :eof

:trimThis
echo [%*]
goto :eof
Ein paar Zeilenumbrüche mehr sollten nicht stören. Hoffen wir dass nie Zeichen wie ><|& in deinem Text vorkommen, dann geht diese Kurzform trotzdem in die Brüche...

Grüße
rubberman
Michael-24
Michael-24 12.10.2015 um 21:31:51 Uhr
Goto Top
Hallo rubberman,

Vielen Dank für die Hilfe.

Aha, so werde ich das probieren. Ich glaube nicht, das die Ausgabe von Diskpart List Disk diese Sonderzeichen mal enthalten. Gut, wissen kann man es nicht, aber für den Moment ist es so ok, da ich diesen Code noch so einigermaßen verstehe.

Wo kann man denn nachlesen was denn mit Echo noch so Möglichkeiten bestehen? Zu Echo %* habe ich gegoogelt, hab aber nix brauchbares gefunden.
rubberman
rubberman 12.10.2015 um 22:04:44 Uhr
Goto Top
Wo kann man denn nachlesen
Weiß ich auch nicht, ehrlich gesagt. Hab ich mir über die Jahre angeeignet.

was denn mit Echo
Hehe, das hat überhaupt nichts mit Echo zu tun, sondern dass der Kommandozeileninterpreter für das "alle Parameter" (alias %*) führende und nachgestellte Leerzeichen entfernt. Ich glaube aber nicht, dass das irgendwo nachzulesen wäre und ich glaube auch nicht, dass sich noch jemand die Mühe macht, das zu dokumentieren. Batch wird zu Gunsten von Powershell weiter an Bedeutung verlieren...

Grüße
rubberman
AnkhMorpork
AnkhMorpork 13.10.2015 um 08:35:20 Uhr
Goto Top
Was mir nicht in den Schädel geht: Dass du einen Powershell-Einzeiler verschmähst und stattdessen ein Multizeilen-Batch einsetzt.
Naja, des Menschen Wille ...

Viel Erfolg

Ankh

P.S. Auch du, mein Sohn Brutus!
rubberman
rubberman 13.10.2015 um 19:01:35 Uhr
Goto Top
Was mir nicht in den Schädel geht: Dass du einen Powershell-Einzeiler verschmähst und stattdessen ein Multizeilen-Batch einsetzt.
Was mir nicht in den Schädel geht: Was ihr nur immer mit Code kurz oder Code lang habt. Es gibt kaum etwas, was uninteressanter ist. Code funktioniert zuverlässig oder Code funktioniert nicht zuverlässig ist doch das was zählt. Und das wäre hier der Grund, mit Powershell statt Batch zu arbeiten.

Grüße
rubberman
AnkhMorpork
AnkhMorpork 14.10.2015 um 08:36:46 Uhr
Goto Top
@rubberman
Meine Meinung: Mit jeder zusätzlichen Codezeile gebe ich mir eine zusätzliche Chance für einen Fehler.

Ich habe Programme mit mehreren tausend Zeilen Code geschrieben, daher glaube ich meinen zu wissen, wovon ich rede.

Gruß

Ankh
rubberman
rubberman 14.10.2015 um 23:47:37 Uhr
Goto Top
Mit jeder zusätzlichen Codezeile gebe ich mir eine zusätzliche Chance für einen Fehler.
Richtig. Und trotzdem halte ich es in meinen (durchaus auch mal mehrere tausend Zeilen langen) Codes so, es so zu schreiben, dass ich den Code auch noch nach einem halben Jahr verstehe. Da darf es gerne mal eine Zeile mehr sein, wenn es so übersichtlicher wird. Und dass auch genau der umgekehrte Fall eintreten kann, zeigt Bibers Dreizeiler, wie ich oben schon kommentiert habe face-wink
Aber nochmal, um Missverständnissen vorzubeugen, ich bin völlig deiner Meinung. Die Powershell ist für diese Aufgabe das bessere Tool. Nur dass meine Begründung eine andere ist face-smile

Grüße
rubberman