String abschneiden
Hallo ich möchte einen durch den Nutzer angegeben String in Form von: "set PATH=C:\Arbeitskopie\trunk" von einem Anderen String der Form: "C:\Arbeitskopie\trunk\Datenpaket\sqlDatei.sql" abschneiden so, dass ein folgender String entsteht: "Datenpaket\sqlDatei.sql" . Lässt sich das per Batch Datei erledigen? Und wenn ja wie?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 114236
Url: https://administrator.de/forum/string-abschneiden-114236.html
Ausgedruckt am: 10.04.2025 um 10:04 Uhr
14 Kommentare
Neuester Kommentar

Du solltest die Systemvariable Path nur dann benutzen/ändern wenn du weißt was du tust.
set MyPath=C:\Arbeitskopie\trunk
set AndererString=C:\Arbeitskopie\trunk\Datenpaket\sqlDatei.sql
call set FolgenderString=%%AndererString:%MyPath%=%%
@77559
Zum Ausgleich für die Vertretung im anderen Thread springe ich mal hier [Edit] etwas voreilig [/Edit] ein
:
In Zeile 3 erfolgt eine Ersetzung - im String
wird der Teil
(BTW: mit einem abschließenden "\" wär's noch besser) durch den Teil nach dem "=" (nämlich nix, da die beiden Prozentzeichen für den Ausgangsstring gelten) ersetzt - Ergebnis:
Die Erklärung dazu findest Du mit "set /?" als "Ersetzen von Umgebungsvariablen".
Die Schreibweise mit "call" habe ich erstmals bei Biber gesehen; alternativ (und dann vielleicht leichter nachvollziehbar) mit "delayedExpansion":
Grüße
bastla
Zum Ausgleich für die Vertretung im anderen Thread springe ich mal hier [Edit] etwas voreilig [/Edit] ein
In Zeile 3 erfolgt eine Ersetzung - im String
C:\Arbeitskopie\trunk\Datenpaket\sqlDatei.sql
C:\Arbeitskopie\trunk
\Datenpaket\sqlDatei.sql
Die Schreibweise mit "call" habe ich erstmals bei Biber gesehen; alternativ (und dann vielleicht leichter nachvollziehbar) mit "delayedExpansion":
@echo off & setlocal enabledelayedexpansion
set MyPath=C:\Arbeitskopie\trunk
set AndererString=C:\Arbeitskopie\trunk\Datenpaket\sqlDatei.sql
set FolgenderString=!AndererString:%MyPath%=!
echo %FolgenderString%
bastla

Das Beispiel funktioniert aber doch bei dir?
Details stehen in der Hilfe von Set /? Wobei ich zugeben muss das der Text dort extrem knapp gefasst ist.
In meinem Beispiel ist str1 der Inhalt einer anderen Variable nämlich MyPath str2 ist leer - es wird also gegen nichts getauscht = gelöscht.
Damit Cmd bei der Abarbeitung zuerst den Inhalt von MyPath einsetzt arbeite ich mit einem Trick der der DelayedExpansion (siehe Hilfe von cmd und/oder setlocal) gleichkommt. Der pseudo Call, denn Set ist ja kein externes Programm oder eine interne Subroutine, bewirkt mit Hilfe der verdoppelten Prozentzeichen dass die Ersetzung erst als zweiter Schritt ausgeführt wird.
Details stehen in der Hilfe von Set /? Wobei ich zugeben muss das der Text dort extrem knapp gefasst ist.
Das Ersetzen von Umgebungsvariablen wurde folgendermaßen erweitert:
%PATH:str1=str2%
Dies erweitert die PATH-Umgebungsvariable, wobei jede Instanz von "str1" im erweiterten Ergebnis mit "str2" ersetzt wird. "str2" kann die leere Zeichenfolge sein, um alle Instanzen von "str1" aus der erweiterten Ausgabe zu löschen. Wenn "str1" mit einem Sternchen beginnt, steht "str1" für alles zwischen dem Anfang der erweiterten Ausgabe bis zum ersten Auftreten des übrigen Abschnitts von "str1".
In meinem Beispiel ist str1 der Inhalt einer anderen Variable nämlich MyPath str2 ist leer - es wird also gegen nichts getauscht = gelöscht.
Damit Cmd bei der Abarbeitung zuerst den Inhalt von MyPath einsetzt arbeite ich mit einem Trick der der DelayedExpansion (siehe Hilfe von cmd und/oder setlocal) gleichkommt. Der pseudo Call, denn Set ist ja kein externes Programm oder eine interne Subroutine, bewirkt mit Hilfe der verdoppelten Prozentzeichen dass die Ersetzung erst als zweiter Schritt ausgeführt wird.

Nein die Ersetzung geht nur mit normalen Variablen mit % vorne und hinten dran. Nich tmit Scheleifenvariablen und auch nicht mit Kommandozeilen Argumenten.
Aber Ich verstehe den Grund für das Splitting nicht, soll das später auf andere Laufwerke/Verzecihnisse angewendet werden?
Viel einfacher ist es wenn du Token anpasst. Du führst hier auch ständig neue uns unbekannte Variablen ein - Ich finde es extrem schwierig dir zu helfen.
Entweder Du schilderst uns dein eigentliches Problem oder Du versuchst das Schritt für Schritt zu verstehen und zu verarbeiten.
Inzwischen geht dies mMn weit über normales Helfen hinaus.
Gruß
LotPings
Aber Ich verstehe den Grund für das Splitting nicht, soll das später auf andere Laufwerke/Verzecihnisse angewendet werden?
Viel einfacher ist es wenn du Token anpasst. Du führst hier auch ständig neue uns unbekannte Variablen ein - Ich finde es extrem schwierig dir zu helfen.
Entweder Du schilderst uns dein eigentliches Problem oder Du versuchst das Schritt für Schritt zu verstehen und zu verarbeiten.
Inzwischen geht dies mMn weit über normales Helfen hinaus.
Gruß
LotPings
Hallo Pantherstyle!
Dein Code müsste auf ein Unterprogramm zurückgreifen. Außerdem muss zuerst der Teilstring gebildet werden und erst danach kannst Du diesen in eine Datei schreiben :
[Edit] Unnötige Überlegungen zur Zerlegung entfernt ... /Edit]
Ansonsten noch ein Hinweis: Das Zerlegen eines Pfades in die Bestandteile "Laufwerk" ("drive"), "Pfad" ("path"), "Dateiname" ("name") und "-typ" ("extension") kannst Du so durchführen:
Näheres dazu gegen Ende von "for /?" ...
Grüße
bastla
Dein Code müsste auf ein Unterprogramm zurückgreifen. Außerdem muss zuerst der Teilstring gebildet werden und erst danach kannst Du diesen in eine Datei schreiben :
:: Eintragung der Pfade
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
for /F "tokens=1* delims=\" %%i IN (%HELP_PATH%\filtertag.txt) DO (
echo %%i\%%j
call :GetRelPath "%%i\%%j" "%TAG_PATH%"
)
echo %RelPath%>>%HELP_PATH%\tagpfade.txt
for /F "tokens=1* delims=\" %%i IN (%HELP_PATH%\filterbranch.txt) DO (
echo %%i\%%j
call :GetRelPath "%%i\%%j" "%TAG_PATH%"
)
echo %RelPath%>>%HELP_PATH%\branchpfade.txt
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
goto :eof
:GetRelPath
set "Full=%~1"
set "Part=%~2"
call set "RelPath=%%Full:%Part%=%%"
goto :eof
Ansonsten noch ein Hinweis: Das Zerlegen eines Pfades in die Bestandteile "Laufwerk" ("drive"), "Pfad" ("path"), "Dateiname" ("name") und "-typ" ("extension") kannst Du so durchführen:
for /f "delims=" %%i in (%HELP_PATH%\filtertag.txt) do (
echo %%~di
echo %%~pi
echo %%~ni
echo %%~xi
REM und als Kombination
echo %%~nxi
)
Grüße
bastla

Zitat von @Pantherstyle:
Hallo,
die Frage ist noch präsent und ich wollte sie nur noch mal ins Gedächtnis zurück hohlen.
Hallo Pantherstyle,Hallo,
die Frage ist noch präsent und ich wollte sie nur noch mal ins Gedächtnis zurück hohlen.
die Sammlung an Codestücken wächst, aber weder ist deine Aufgabenstellung ganz klar noch ist dein Feedback ausreichend.
Es funktioniert nicht, hilft Niemand.
Welches Ergebnis erwartest Du mit Beispieldaten vorher + nachher.
allerdings wurde mir aufgetragen, eine Variante ohne das Ersetzen von tokens zu kreieren.
Das verstehe ich jetzt überhaupt nicht. Ist das eine Übungsaufgae? Dann knie dich selber rein, so lernt man Besten."Tokens" sind ein Bestandteil des For /F Befehls und dienen der Bestimmung welche der durch "Delmis" getrennten Elemente weiterverwendet werden sollen. Siehe For /F
Gruß
LotPings
Moin Pantherstyle,
ich kann LotPings Eindruck nur bestätigen - die eingangs genannte Aufgabenstellung korrespondiert wenig bis gar nicht mit Deinen geposteten Schnipseln und die Lösungsstrategien in den Antworten scheinst Du zu überlesen.
Auch ich habe wenig Anlass zur Hoffnung, dass mein Kommentar von Dir berücksichtigt wird, aber diesen letzten Versuch mache ich noch.
bastla und LotPings haben doch oben eine Lösung gepostet, die Du, ich, wir alle jederzeit am CMD-Prompt verifizieren könnten:
[Eingegebene Zeilen mit ">" gekennzeichnet]
---> Das würde also klappen, wenn Du es direkt in Deine "branchpfade schreiben lässt OHNE SET und OHNE das "Stringteiler=", aber WTF soll denn passieren bei Deinem
...da der "Set var=wert"-Befehl keine Ausgabe erzeugt wird auch nie etwas Brauchbares in der "branchpfade.txt" stehen.
Und die Variable %Stringteiler% verwendest Du ja auch nicht -- was also ist Deine Erwartungshaltung???
Abgesehen davon - IMHO ist es sinnvoller, diese ganze SVN-Workspace-Ein-und-Auscheckerei so zu machen wie 283.000 andere User auch:
Grüße
Biber
ich kann LotPings Eindruck nur bestätigen - die eingangs genannte Aufgabenstellung korrespondiert wenig bis gar nicht mit Deinen geposteten Schnipseln und die Lösungsstrategien in den Antworten scheinst Du zu überlesen.
Auch ich habe wenig Anlass zur Hoffnung, dass mein Kommentar von Dir berücksichtigt wird, aber diesen letzten Versuch mache ich noch.
bastla und LotPings haben doch oben eine Lösung gepostet, die Du, ich, wir alle jederzeit am CMD-Prompt verifizieren könnten:
[Eingegebene Zeilen mit ">" gekennzeichnet]
>set "pfadA=C:\ÜberOrdner\Unterüberordner"
>set "pfadB=C:\ÜberOrdner\UnterÜberOrdner\UnterOrdner\Datei"
>call echo Stringteiler=%PfadB:%PfadA%=%
Stringteiler=\UnterOrdner\Datei
Set Stringteiler=... >>branchpfade.txt"
???>set something=whatever>bla.txt
>type bla.txt
>
Und die Variable %Stringteiler% verwendest Du ja auch nicht -- was also ist Deine Erwartungshaltung???
Abgesehen davon - IMHO ist es sinnvoller, diese ganze SVN-Workspace-Ein-und-Auscheckerei so zu machen wie 283.000 andere User auch:
- Definiert auf den Clients mit dem SUBST-Befehl ein Laufwerk T: wie "trunk" oder "team"
SUBST T: C:\Arbeitskopie\trunk
...dann hast Du Deinen so genannten "Restpfad" immer richtig.Grüße
Biber