atlas2
Goto Top

Leerzeichen am Ende einer Variablen entfernen

Leerzeichen am Ende einer Variablen entfernen

Hallo zusammen,

ich stehe gerade leider auf dem Schlauch bei der Lösung des o.g. Problems. Ich extrahiere aus einer Textdatei immer eine bestimmte Zeile. Das erreiche ich hiermit:

for /f "delims=" %%i in ('findstr /n . %file% ^| findstr "^2:"') do set "line=%%i" && echo !line:~2! | clip  

Leider befindet sich am Ende der Variablen dann immer ein Leerzeichen. Der Versuch dieses mit

set "line=%line: =%"  

zu entfernen klappt leider nicht. Wie kann ich dieses Leerzeichen entfernen?
Danke
VG

Content-ID: 62139518183

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

Ausgedruckt am: 21.11.2024 um 17:11 Uhr

rubberman
rubberman 07.07.2024 aktualisiert um 17:43:22 Uhr
Goto Top
Hallo,

dein ECHO schreibt das Leerzeichen ja auch explizit. Hat nichts mit dem Wert in deiner Variablen zu tun. Entferne es einfach zwischen der Variablen und der Pipe (|) zum Clip Kommando.

Grüße
rubberman
MysticFoxDE
MysticFoxDE 07.07.2024 um 21:15:26 Uhr
Goto Top
Moin @roachman,

Wie kann ich dieses Leerzeichen entfernen?

versuch es mal damit.

for /f "delims=" %%i in ('findstr /n . %file% ^| findstr "^2:"') do (  
    set "line=%%i"  
    set "line=!line:~2!"  
    :trimLoop
    if "!line:~-1!"==" " (  
        set "line=!line:~0,-1!"  
        goto :trimLoop
    )
    echo !line! | clip
)

Gruss Alex
rubberman
Lösung rubberman 07.07.2024 um 21:24:50 Uhr
Goto Top
Zitat von @MysticFoxDE:

    echo !line! | clip

Nope. Auch hier liegt das Problem immer noch zwischen !line! und |. Dieses Leerzeichen gehört zur ECHO Ausgabe und das hat nichts mit dem Wert in der Variablen zu tun.

Um das zu lösen (und um ein paar Aufrufe von externen Kommandozeilentools einzusparen) sähe meine Lösung so aus:
set "line="  
:: ignoriere die erste Zeile und lese die zweite in Variable line.
<"!file!" (set /p "=" &set /p "line=")  
echo(!line!|clip

Grüße
Steffen
MysticFoxDE
MysticFoxDE 07.07.2024 um 22:10:10 Uhr
Goto Top
Moin @rubberman,

Nope. Auch hier liegt das Problem immer noch zwischen !line! und |. Dieses Leerzeichen gehört zur ECHO Ausgabe und das hat nichts mit dem Wert in der Variablen zu tun.

ganz sicher nicht.
Kannst ja ganz einfach mit ...

$test = "Test "  
echo $test | clip

... oder ...

$test = "Test"  
echo $test | clip

... durchtesten. 😉

Gruss Alex
rubberman
rubberman 07.07.2024 um 22:21:16 Uhr
Goto Top
Hey Alex

Batch vs. PowerShell
Die beiden verhalten sich fundamental anders.
Anders gesagt, ich brauch das nicht durchzutesten, da ich weiß dass dein PowerShell Code funktioniert. Aber eben nicht so in einem Batch Code. Und das hab ich eben noch mal getestet face-wink

Grüße
Steffen
Atlas2
Atlas2 08.07.2024 um 09:37:57 Uhr
Goto Top
Hallo zusammen,
vielen Dank erstmal für eure Rückmeldungen und Diskussionen. Konnte nun die Vorschläge testen.

Zitat von @MysticFoxDE:

Moin @roachman,

Wie kann ich dieses Leerzeichen entfernen?

versuch es mal damit.

for /f "delims=" %%i in ('findstr /n . %file% ^| findstr "^2:"') do (  
    set "line=%%i"  
    set "line=!line:~2!"  
    :trimLoop
    if "!line:~-1!"==" " (  
        set "line=!line:~0,-1!"  
        goto :trimLoop
    )
    echo !line! | clip
)

Gruss Alex

Leider hat das nicht funktioniert, da durch das "echo" wie rubberman sagte es innerhalb der Batch zu diesem Leerzeichen kommt.

Zitat von @rubberman:


Um das zu lösen (und um ein paar Aufrufe von externen Kommandozeilentools einzusparen) sähe meine Lösung so aus:
set "line="  
:: ignoriere die erste Zeile und lese die zweite in Variable line.
<"!file!" (set /p "=" &set /p "line=")  
echo(!line!|clip

Grüße
Steffen

Danke Steffen, das hat funktioniert! Auch wenn mir aktuell bei dem Code nicht klar ist, warum die erste Zeile übersprungen wird. Was mich auch interessiert, ist in Zeile 4 das die Klammer an der Stelle nur geöffnet wird?

Da es nicht immer die zweite Zeile sein muss die ich Auswerte, habe ich den alten code mit deinem Kombiniert sodass ich es nun so nutze.

for /f "delims=" %%i in ('findstr /n . %file% ^| findstr "^2:"') do set "line=%%i" && echo(!line:~2!|clip  

Danke nochmal.
VG
MysticFoxDE
MysticFoxDE 08.07.2024 um 12:33:32 Uhr
Goto Top
Moin @steffen,

Die beiden verhalten sich fundamental anders.
Anders gesagt, ich brauch das nicht durchzutesten, da ich weiß dass dein PowerShell Code funktioniert. Aber eben nicht so in einem Batch Code. Und das hab ich eben noch mal getestet face-wink

nice, schon wieder was dazugelernt, danke. 👍
Wobei ich das wahrscheinlich nicht wirklich anwenden werde, da ich die letzten 10 Jahre noch nie PowerShell aus einer Batch ausführen musste. Aber ja, was nicht ist, kann ja immer noch werden. 🙃

Gruss Alex
rubberman
rubberman 08.07.2024 um 17:19:48 Uhr
Goto Top
Hey Alex

Wobei ich das wahrscheinlich nicht wirklich anwenden werde, da ich die letzten 10 Jahre noch nie PowerShell aus einer Batch ausführen musste. Aber ja, was nicht ist, kann ja immer noch werden. 🙃

War auch nicht so gemeint. Deine letzten Testcodes waren PowerShell, auch wenn das ganze durch echo (als Alias für das Write-Output CmdLet) einem Batch Code ähnlich sieht. Die Verwendung des Dollarzeichens für Variablen hat mir aber letztlich verraten dass du in der PowerShell unterwegs warst und nicht in Batch face-smile

Grüße
Steffen
rubberman
rubberman 08.07.2024 um 17:44:42 Uhr
Goto Top
Hallo @roachman

Danke Steffen, das hat funktioniert! Auch wenn mir aktuell bei dem Code nicht klar ist, warum die erste Zeile übersprungen wird.

Der Filestream wird in den Klammerausdruck umgeleitet und bleibt somit geöffnet solange bis darin alles abgearbeitet ist. Die SET /P Anweisungen lesen jeweils eine Zeile aus dem Stream. Die erste sieht etwas wild aus, da sie keinen Variablenname enthält. Heißt, die erste Zeile wird zwar gelesen, kann aber nirgends zugewiesen werden und wird dadurch verworfen.

Was mich auch interessiert, ist in Zeile 4 das die Klammer an der Stelle nur geöffnet wird?

Die kannst du auch durch ein Leerzeichen ersetzen. Ist nur dafür da dass wenn die Variable mal nicht definiert ist (also z.B. eine Leerzeile in der Datei ist) du keine wilden Dinge wie ECHO ist ausgeschaltet (OFF). in deiner Zwischenablage findest, was eher verwirrend als hilfreich wäre. In Uralt-Codes wirst du vermutlich eher einen Punkt als eine öffnende Klammer an dieser Stelle finden. Der kann aber erhebliche Nebeneffekte verursachen und ist eher der Worst Case aller infrage kommenden Trennzeichen zu diesem Zweck.

Da es nicht immer die zweite Zeile sein muss die ich Auswerte, habe ich den alten code mit deinem Kombiniert sodass ich es nun so nutze.

Auch OK. Du kannst den Doppelpunkt dann aber als Delimiter definieren um dir hinten raus die Variablenmanipulation (Wegschneiden der Zeilennummer) zu ersparen. Ungetestet:
for /f "tokens=1* delims=:" %%i in ('findstr /n . %file% ^| findstr "^2:"') do echo(%%j|clip  

Grüße
Steffen
Atlas2
Atlas2 09.07.2024 um 07:48:11 Uhr
Goto Top
Hi Steffen,

Zitat von @rubberman:


Der Filestream wird in den Klammerausdruck umgeleitet und bleibt somit geöffnet solange bis darin alles abgearbeitet ist. Die SET /P Anweisungen lesen jeweils eine Zeile aus dem Stream. Die erste sieht etwas wild aus, da sie keinen Variablenname enthält. Heißt, die erste Zeile wird zwar gelesen, kann aber nirgends zugewiesen werden und wird dadurch verworfen.

Was mich auch interessiert, ist in Zeile 4 das die Klammer an der Stelle nur geöffnet wird?

Die kannst du auch durch ein Leerzeichen ersetzen. Ist nur dafür da dass wenn die Variable mal nicht definiert ist (also z.B. eine Leerzeile in der Datei ist) du keine wilden Dinge wie ECHO ist ausgeschaltet (OFF). in deiner Zwischenablage findest, was eher verwirrend als hilfreich wäre. In Uralt-Codes wirst du vermutlich eher einen Punkt als eine öffnende Klammer an dieser Stelle finden. Der kann aber erhebliche Nebeneffekte verursachen und ist eher der Worst Case aller infrage kommenden Trennzeichen zu diesem Zweck.

Da es nicht immer die zweite Zeile sein muss die ich Auswerte, habe ich den alten code mit deinem Kombiniert sodass ich es nun so nutze.

Danke für den Input ;) habe es verstanden


Auch OK. Du kannst den Doppelpunkt dann aber als Delimiter definieren um dir hinten raus die Variablenmanipulation (Wegschneiden der Zeilennummer) zu ersparen. Ungetestet:
for /f "tokens=1* delims=:" %%i in ('findstr /n . %file% ^| findstr "^2:"') do echo(%%j|clip  


Jo, gute Idee dann habe ich mir das gespart.

Danke
VG
MysticFoxDE
MysticFoxDE 09.07.2024, aktualisiert am 10.07.2024 um 06:39:18 Uhr
Goto Top
Moin Steffen,

War auch nicht so gemeint. Deine letzten Testcodes waren PowerShell, auch wenn das ganze durch echo (als Alias für das Write-Output CmdLet) einem Batch Code ähnlich sieht. Die Verwendung des Dollarzeichens für Variablen hat mir aber letztlich verraten dass du in der PowerShell unterwegs warst und nicht in Batch face-smile

und ich war mir gerade wegen "|" eigentlich ganz sicher, dass der TO in Power-Shell unterwegs war.

Denn bis zu diesem Post und deinem Kommentar, war es mir bisher nicht wirklich bewusst, dass ich "|" so ähnlich wie auch bei Power-Shell auch in einem Batch Code verwenden kann ... 😬 ... Schande über mein Haupt ... ein wenig zumindest ... denn selbst als ein älterer Hase ... ähm, ja, OK OK, denn selbst als ein älterer Fuchs, hat man in der IT noch lange nicht wirklich ausgelernt. 😁

Daher liebe ich diesen Job auch so sehr ... meistens zumindest. 🤪

Gruss Alex