okidoki
Goto Top

Batch - (Vorderen) String erhalten (String abschneiden II)

Den genialen Vorschlag von Bastla Batch - String abschneiden würde ich gerne noch einmal aufgreifen und wissen, wie der vordere Teil eines Strings erhalten bleiben kann, sprich, nach einem : den hinteren Teil abzuschneiden (samt : face-smile).

Mein Problem ist diese Variable, aus der ich die Zeilennummer (mal 1, mal 2-stellig) extrahieren möchte (wobei die Pfade ebenfalls variabel sind):

D:\batches\temp>set variable=test.txt:19:D:\batches\temp>set
oder so
D:\batches\temp>set variable=test.txt:7:D:\batches\temp>set

Nach Bastlas Version bleibet übrig:
19:D:\batches\temp>set
oder so:
7:D:\batches\temp>set

Hier noch einmal sein Code:
set "string=%string:*:=%"  

Wie gelingt es, den hinteren Teil nach einem : abzuschneiden? So jedenfalls nicht:
set "string=%string::*=%"  

Content-Key: 637095

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

Printed on: April 20, 2024 at 02:04 o'clock

Mitglied: 147069
147069 Jan 02, 2021 updated at 11:04:48 (UTC)
Goto Top
Für sowas nimmst du einfach gleich nen For-Loop
@echo off
set "string=test.txt:7:D:\batches\temp"  
for /f "tokens=2 delims=:" %%a in ("%string%") do set "linenum=%%a"  
echo %linenum%

Solltest du dir mal in einer ruhigen Stunde rein ziehen, dann sind 99% deiner Fragen hier obsolet face-wink
Tutorial zur FOR-Schleife
Member: OKIDOKI
OKIDOKI Jan 02, 2021 at 10:39:33 (UTC)
Goto Top
bluewonder vielen Dank!

Den Beitrag kannte ich noch gar nicht, dieses Forum ist einfach SPITZENKLASSE.

Eine Anmerkung hätte ich dennoch, nach Durchsicht deines verlinkten Beitrags.
Vielleicht die fehlenden 1% face-smile

Müsste es nicht vielmehr lauten:
@echo off
set "string=test.txt:7:D:\batches\temp"  
for /f "tokens=2 delims=:" %%a in ("%string%") do set "linenum=%%a"  
echo %linenum%

Also tokens=2 durch 1 ersetzen?
Ansonsten bleibt, zumindest in meinem Bespiel, nur das D übrig!
Mitglied: 147069
147069 Jan 02, 2021 updated at 11:23:29 (UTC)
Goto Top
Zitat von @OKIDOKI:
Eine Anmerkung hätte ich dennoch, nach Durchsicht deines verlinkten Beitrags.
Vielleicht die fehlenden 1% face-smile
Nein. Der Code s wie er oben steht läuft einwandfrei!
Müsste es nicht vielmehr lauten:
> @echo off
> set "string=test.txt:7:D:\batches\temp"  
> for /f "tokens=2 delims=:" %%a in ("%string%") do set "linenum=%%a"  
> echo %linenum%
> 
Also tokens=2 durch 1 ersetzen?
Nein, du willst ja die Zahl haben und die ist nunmal an zweiter Stelle! Token 1 wäre test.txt und Token 2 ist 7. Works as designed face-wink.
Ansonsten bleibt, zumindest in meinem Bespiel, nur das D übrig!
Dann hast du schon den ersten Teil abgeschnitten ich gehen davon aus das in der Variablen der Dateiname noch enthalten ist face-smile. Einfach Bastlas Sachen weglassen und nur die For-Schleife nutzen, die macht es all in one ohne weitere nötigen Maßnahmen.
Guckst du einfach mal genau in meinen Code und was da steht ....
set "string=test.txt:7:D:\batches\temp"
Member: OKIDOKI
OKIDOKI Jan 02, 2021 updated at 12:45:36 (UTC)
Goto Top
Hey bluewonder, vielen Dank!
Ja, stimmt, haut hin!

Trotzdem komme ich jetzt nach dem "Zusammenbau" ins Schlingern:

Frage Batch: String in Variable gibt es leider (noch) keine Lösung, wobei ich dachte, eine einfache zu haben.

Problem:
Textdatei > Suchwort lokalisieren > Zeile auslesen

Soweit habe ich das Suchwort finden können mit Kennzeichnung der Zeile. Nun ging es hier weiter mit Zeilennummer auslesen und dann entsprechend Zeile in Variable schreiben - fertig! Hört sich irgendwie einfach an, treibt mich aber schier zur Verzweiflung ...

Hier mein bisheriges Ergebnis, wobei plötzlich die Zeilennummer in der Variablen fehlt:
for /f %%a in ('powershell -Command "select-string -path test.txt -pattern 'zong', 'ping'"') do set variable=%%a  
for /f "tokens=2 delims=:" %%a in ("%variable%") do set "zeile=%%a"  
set /A zeile=%zeile%-2
set /a x1=%zeile%
for /f "tokens=* delims=~ skip=%x1%" %%i in (test.txt) do call :ablauf1 %%i  
:ablauf1
set x=%*
echo finally Zeile anzeigen %x%

btw: in der test.txt steht immer nur in jeden 2. Zeile etwas!

Hast du (jemand) eine Idee, woran es jetzt noch haken könnte?
Mitglied: 147069
Solution 147069 Jan 02, 2021 updated at 14:15:00 (UTC)
Goto Top
Ach gottchen das ist doch völliger Murks face-big-smile. Das geht viel einfacher, in der Powershell hast du nämlich eine Property für die Zeilennnummer auf die du direkt zugreifen kannst, da braucht man keine Strings parsen ... Powershell arbeitet mit Objekten und nicht primär wie in Batch mit Strings, guckst du unten das Bild face-wink
for /f "delims=" %%a in ('powershell -EP Bypass -C "sls -Path D:\test.txt -Pattern 'ping','zong' -SimpleMatch | select -Expand LineNumber"') do @echo Fundort in Zeile %%a
Brauchst du statt der Zeilennummer den Inhalt der Zeile, einfach die Property durch Line austauschen
for /f "delims=" %%a in ('powershell -EP Bypass -C "sls -Path D:\test.txt -Pattern 'ping','zong' -SimpleMatch | select -Expand Line"') do @echo Zeileninhalt: %%a

screenshot

Feddisch.
Member: mayho33
mayho33 Jan 02, 2021 at 14:43:54 (UTC)
Goto Top
Zitat von @147069:

Für sowas nimmst du einfach gleich nen For-Loop
> @echo off
> set "string=test.txt:7:D:\batches\temp"  
> for /f "tokens=2 delims=:" %%a in ("%string%") do set "linenum=%%a"  
> echo %linenum%
> 

Solltest du dir mal in einer ruhigen Stunde rein ziehen, dann sind 99% deiner Fragen hier obsolet face-wink
Tutorial zur FOR-Schleife


Dafür, dass du -wie du sagst- kein geübter Tutorialschreiber bis, ist es aber sehr gut gelungen!

Grüße!
Member: mayho33
mayho33 Jan 02, 2021 at 14:47:48 (UTC)
Goto Top
Zitat von @147069:

Ach gottchen das ist doch völliger Murks face-big-smile. Das geht viel einfacher, in der Powershell...
Feddisch.

Ich würde ja auch sofort auf PS zurückgreifen. Batch ist für mich ein rotes Tuch. Aber manche wollen das halt so. Sollte man respektieren.

Grüße!
Mitglied: 147069
147069 Jan 02, 2021 updated at 15:49:11 (UTC)
Goto Top
Zitat von @mayho33:
Ich würde ja auch sofort auf PS zurückgreifen. Batch ist für mich ein rotes Tuch. Aber manche wollen das halt so. Sollte man respektieren.
Habe ich ja, das obige ist Batch nur eben mit etwas PS gewürzt wie er es auch in seinem anderen Post ja auch schon macht face-smile.
Member: OKIDOKI
OKIDOKI Jan 02, 2021 at 17:57:19 (UTC)
Goto Top
Über einfache Lösungen würde ich mich SO freuen, daher vielen Dank an bluewonder und mayho33!

Klar, Batch ist alt und bäh, dennoch habe ich meinen Hauptcode im Batch - lässt sich jetzt so ohne Weiteres (non profit) auch nicht ändern.
Ich finde es trotzdem irre, dass sich eben auch powershell integrieren lässt ...

Daher jetzt noch meine Anschlussfrage (vermutlich auch Murks):
Wie bekomme ich die Variabel in Batch über geben? also, aus PS ... funktionieren tut es SUPER, wie an der Console zu sehen ist ...
Mitglied: 147069
147069 Jan 02, 2021 updated at 18:34:24 (UTC)
Goto Top
Zitat von @OKIDOKI:

Über einfache Lösungen würde ich mich SO freuen, daher vielen Dank an bluewonder und mayho33!
Lösung steht doch schon oben, wie oft denn noch???
Klar, Batch ist alt und bäh, dennoch habe ich meinen Hauptcode im Batch - lässt sich jetzt so ohne Weiteres (non profit) auch nicht ändern.
Ich finde es trotzdem irre, dass sich eben auch powershell integrieren lässt ...

Daher jetzt noch meine Anschlussfrage (vermutlich auch Murks):
Wie bekomme ich die Variabel in Batch über geben? also, aus PS ... funktionieren tut es SUPER, wie an der Console zu sehen ist ...
Öhm schau dir den Code doch mal genau an das ist schon Batchcode sogar zwei Varianten je nachdem was du brauchst, einfach das @echo durch ein set ersetzen und fertig, was gibbet daran jetzt nicht zu verstehen??
Meine Güte, einfach mal dat Ding da auf dem Hals ab und zu auch benutzen wofür es geschaffen wurde 🤔
Member: OKIDOKI
OKIDOKI Jan 02, 2021 updated at 19:11:54 (UTC)
Goto Top
face-smile Bitte nicht böse sein ....
Das Problem ist, glaube ich, dass es mehrere Funde gibt. Daher ist mir unklar. wie ich an die passenden Variablen komme:
D:\batches\temp-auslesen>for /F "delims=" %a in ('powershell -EP Bypass -C "sls -Path test.txt -Pattern 'ping','zong' -SimpleMatch | select -Expand LineNumber"') do @echo Fundort in Zeile %a  
Fundort in Zeile 3
Fundort in Zeile 17
Fundort in Zeile 29
Mit deinem zweiten Code werden die Zeilen wunderbar und super korrekt ausgegeben, also alles tutti face-smile, aber wie arbeite ich mit den mehreren Variablen?
Wird die Variable aufgerufen steht hinter dem Inhalt witzigerweise: ...>if

Ich freue mich so über die Möglichkeiten! Für einen Einsteiger ein erhebendes Gefühl, kann ich dir sagen! Gerade in diesem Jahr möchte ich mich schon über Kleinigkeiten freuen ... Danke euch!!!

PS: Klar, echo durch set ersetzen (icon Brett vor'm Kopf)
Mitglied: 147069
Solution 147069 Jan 02, 2021 updated at 21:43:55 (UTC)
Goto Top
Daher ist mir unklar. wie ich an die passenden Variablen komme:
Brauchst du gar nicht einfach im For Loop passend verarbeiten dann sind Variablen Schall und Rauch und überflüssig ... Denn mit %%a hast du schon deine Variable auch mehrfach hintereinander

@echo off
for /f "delims=" %%a in ('powershell -EP Bypass -C "sls -Path D:\test.txt -Pattern 'ping','zong' -SimpleMatch | select -Expand Line"') do (  
    echo Zeileninhalt: %%a
    REM Tu irgendwas anderes mit %%a
)
Brauchst du wirklich ne extra Variable in der Schleife dann
@echo off &setlocal enabledelayedexpansion
for /f "delims=" %%a in ('powershell -EP Bypass -C "sls -Path D:\test.txt -Pattern 'ping','zong' -SimpleMatch | select -Expand Line"') do (  
    set "var=%%a"  
    echo Tu was mit: !var!
)
Und jetzt komm mir bloß nicht mit "warum nutzt du statt Prozentzeichen Ausrufezeichen?" Lies das obige verlinkte Tutorial zur For-Schleife dann verstehst du es.

Icke bin jetzt raus.
Member: OKIDOKI
OKIDOKI Jan 02, 2021 updated at 22:48:58 (UTC)
Goto Top
Ihr Lieben, vielen Dank mayho33 und bluewonder, besonders auch für eure Geduld mit mir!
Eure Lösungen sind flexibel und genauso, wie ich sie brauche. Außerdem bieten sie Raum zum weiteren Probieren.
Ich hoffe, diese Beispiele helfen auch denen, deren Hilferufen ich oft begegnet bin.

Dieses Forum hat in seiner Qualität in den Jahren mit Abstand zugelegt - Danke dafür!
okidoki