Zeichen in Textdatei finden und ändern mit Batch
Hallo
Wieder einmal stehe ich vor einem Problem.
Ich habe ein Batchscipt geschrieben, mit welchem ich auf einem Laufwerk nach einer Datei suche und diese mit vollständigem Pfad in eine Textdatei speichere.
Diese eine Zeile in der Textdatei wird in einem weiteren Script als Variable verwendet.
Letztendlich soll die Variable (z.B. C:\Users\User\AppData\Local\Microsoft\Outlook\Outlook.pst) in eine Registrierungsdatei eingebunden werden, so dass diese von anderen Programmen gelesen werden kann.
Das Problem dabei ist, dass aus den \ ein \\ werden muss.
Wie kann ich das mit Batch mitteln bewerkstelligen?
Wieder einmal stehe ich vor einem Problem.
Ich habe ein Batchscipt geschrieben, mit welchem ich auf einem Laufwerk nach einer Datei suche und diese mit vollständigem Pfad in eine Textdatei speichere.
Diese eine Zeile in der Textdatei wird in einem weiteren Script als Variable verwendet.
Letztendlich soll die Variable (z.B. C:\Users\User\AppData\Local\Microsoft\Outlook\Outlook.pst) in eine Registrierungsdatei eingebunden werden, so dass diese von anderen Programmen gelesen werden kann.
Das Problem dabei ist, dass aus den \ ein \\ werden muss.
Wie kann ich das mit Batch mitteln bewerkstelligen?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 133901
Url: https://administrator.de/forum/zeichen-in-textdatei-finden-und-aendern-mit-batch-133901.html
Ausgedruckt am: 23.04.2025 um 01:04 Uhr
12 Kommentare
Neuester Kommentar
Moin ForgottenAlmÖdi,
Demo am CMD-Prompt (">" an der ersten Stelle NICHT mit eingeben; ist mein Prompt):
In dem Beispiel werden mit
alle einfachen Slashes (/) in der Variable %pstpfad% durch doppelte (2x/) ersetzt.
Probier damit anderthalb Minuten am CMD.Prompt.... dann hast du das Prinzip verstanden.
Grüße
Biber
Demo am CMD-Prompt (">" an der ersten Stelle NICHT mit eingeben; ist mein Prompt):
(=11:51:28 D:\temp=)
>set "pstPfad=C:\Users\User\AppData\Local\Microsoft\Outlook\Outlook.pst"
(=11:51:53 D:\temp=)
>echo set "regpstpfad=%pstpfad:\=\\%"
set "regpstpfad=C:\\Users\\User\\AppData\\Local\\Microsoft\\Outlook\\Outlook.pst"
In dem Beispiel werden mit
...%pstPfad:/=//%
Probier damit anderthalb Minuten am CMD.Prompt.... dann hast du das Prinzip verstanden.
Grüße
Biber
Moin ForgottenRealm,.
Wieder am CMD-Prompt:
Grüße
Biber
[Edit]
P.S. Evtl. ist es natürlich sinnvoller, nicht die letzten 12 oder 15 Stellen abzuschneiden... das ist nicht sonderlich variabel
Du kannst --weil es flexibler ist und das Gleiche kostet--- auch aus dem ausgelesenen alten Reg-Wert für Lw+Pfad+Anwendung.exe alles außer Anwendung.exe rausfrickeln.
[wieder Demo am CMD-Prompt]
... und davon kannst du immer das letzte Zeichen (den Backslash) abschneiden und kompostieren.
[/Edit]
Zitat von @ForgottenRealm:
Mit ... set path=%pstPfad:~-12% werden allerdings nur die Zeichen in der Variable gespeichert, die ich dort eben nicht mehr haben möchte.
Hast du dafür auch eine Lösung ?
ist der Papst katholisch?Mit ... set path=%pstPfad:~-12% werden allerdings nur die Zeichen in der Variable gespeichert, die ich dort eben nicht mehr haben möchte.
Hast du dafür auch eine Lösung ?
Wieder am CMD-Prompt:
(=20:10:07 D:\temp=)
>set "pstPfad=C:\Users\User\AppData\Local\Microsoft\Outlook\Outlook.pst"
(=20:10:15 D:\temp=)
>echo %pstpfad:~0,-12%
C:\Users\User\AppData\Local\Microsoft\Outlook
Grüße
Biber
[Edit]
P.S. Evtl. ist es natürlich sinnvoller, nicht die letzten 12 oder 15 Stellen abzuschneiden... das ist nicht sonderlich variabel
Du kannst --weil es flexibler ist und das Gleiche kostet--- auch aus dem ausgelesenen alten Reg-Wert für Lw+Pfad+Anwendung.exe alles außer Anwendung.exe rausfrickeln.
[wieder Demo am CMD-Prompt]
>for %i in ("%pstpfad%") do @echo %~dpi
C:\Users\User\AppData\Local\Microsoft\Outlook\
[/Edit]
Moin ForgottenRealm,
sorry, Missverständnis. Ich habe wieder die CMD-Prompt-proof-of-concept-Zeile gepostet.
So wie abgebildet (ohne das erste ">") funktioniert die am CMD-Prompt.
Du hast die as is als eine Batchzeile übernommen-- aber im Batch müssen vor die dynamischen (FOR-Anweisungs-)Variablen ZWEI Prozentzeichen.
CMD-Variante:
for %i in ("%pstpfad%") do @echo %~dpi
Batch Variante:
for %%i in ("%pstpfad%") do @echo %%~dpi
Wenn ich meine Demo-Halbzeile in eine Batch-Datei namens Onetemp.bat schreibe kann ich dein Ergebnis reproduzieren.
Grüße
Biber
sorry, Missverständnis. Ich habe wieder die CMD-Prompt-proof-of-concept-Zeile gepostet.
So wie abgebildet (ohne das erste ">") funktioniert die am CMD-Prompt.
Du hast die as is als eine Batchzeile übernommen-- aber im Batch müssen vor die dynamischen (FOR-Anweisungs-)Variablen ZWEI Prozentzeichen.
CMD-Variante:
for %i in ("%pstpfad%") do @echo %~dpi
Batch Variante:
for %%i in ("%pstpfad%") do @echo %%~dpi
Wenn ich meine Demo-Halbzeile in eine Batch-Datei namens Onetemp.bat schreibe kann ich dein Ergebnis reproduzieren.
(=21:01:26 D:\temp=)
>onetemp.bat
"pstpfad~dpi" ist syntaktisch an dieser Stelle nicht verarbeitbar.
Grüße
Biber
Na ja, ForgottenRealm,
sagen wir so... in der Batchdatei stehen ja zwei angefangene Wege... einer für das Schreiben via Reg.exe, einer für RegEdit.exe.
Funktionieren würde beides, aber entscheide dich (meinetwegen per Münze) für EINEN Weg und trenne dich von den [meist ausgeREMten) Codetrümmern.
Denn dann spätestens wird dir auffallen, dass die zeitaufwändigste Operation in dem Schnipsel, die erste FOR-Anweisung in Zeile 36-38, eine Datei %FINISH% erzeugt, die nur noch zum Löschen gebraucht wird.
Dampfe erstmal den Schnipsel auf das zusammen, was vermutlich gebraucht wird, ich stehe dann morgen gern wieder zur Verfügung.
Grüße
Biber
sagen wir so... in der Batchdatei stehen ja zwei angefangene Wege... einer für das Schreiben via Reg.exe, einer für RegEdit.exe.
Funktionieren würde beides, aber entscheide dich (meinetwegen per Münze) für EINEN Weg und trenne dich von den [meist ausgeREMten) Codetrümmern.
Denn dann spätestens wird dir auffallen, dass die zeitaufwändigste Operation in dem Schnipsel, die erste FOR-Anweisung in Zeile 36-38, eine Datei %FINISH% erzeugt, die nur noch zum Löschen gebraucht wird.
Dampfe erstmal den Schnipsel auf das zusammen, was vermutlich gebraucht wird, ich stehe dann morgen gern wieder zur Verfügung.
Grüße
Biber
Hallo ForgottenRealm!
Wenn Du davon ausgehst (und das tust Du zumindest implizit, indem Du nur die erste Zeile der Datei %FINISH% einliest), dass es nur eine einzige Fundstelle für %FILE% geben kann, dann lässt sich die ganze Sucherei ja auf etwas in der Art
reduzieren (OK, damit wird nicht, wie in Deiner Version, die erste, sondern die letzte passende Datei gefunden - aber wenn's eh nur eine ist ...
; zur Not geht's aber so ähnlich auch für die erste).
Wenn Dir an meinem Ansatz ev auffällt, dass ich nicht den Variablennamen %PATH% verwende, dann kann ich Dir versichern, dass das einen guten Grund hat - dadurch wird nämlich Deine Frage "Woran liegt das ?" gegenstandslos ...
Grüße
bastla
P.S.: Ich warte noch immer auf einen anderen guten Grund - nämlich jenen für die Verwendung eines allein stehenden "
(Du musst Dich aber nicht speziell angesprochen fühlen - ich denke nur laut vor mich hin ...)
Wenn Du davon ausgehst (und das tust Du zumindest implizit, indem Du nur die erste Zeile der Datei %FINISH% einliest), dass es nur eine einzige Fundstelle für %FILE% geben kann, dann lässt sich die ganze Sucherei ja auf etwas in der Art
set "Pfad="
for %%i in (%DRIVES%) do (
for /f "delims=" %%a in ('dir /S /B /A-D "%%i:\%FILE%"') do set "Pfad=%%a"
)
if not defined Pfad echo "%FILE%" nicht gefunden! & goto :eof
Wenn Dir an meinem Ansatz ev auffällt, dass ich nicht den Variablennamen %PATH% verwende, dann kann ich Dir versichern, dass das einen guten Grund hat - dadurch wird nämlich Deine Frage "Woran liegt das ?" gegenstandslos ...
Grüße
bastla
P.S.: Ich warte noch immer auf einen anderen guten Grund - nämlich jenen für die Verwendung eines allein stehenden "
exit
"(Du musst Dich aber nicht speziell angesprochen fühlen - ich denke nur laut vor mich hin ...)
Hallo ForgottenRealm!
Grüße
bastla
ohne ein Exit wird eine aufgerufene nicht von selber beendet.
Kann ich nicht nachvollziehen - wenn ein "Folgebatch" gestartet, dessen Ende aber nicht abgewartet werden soll, einfach den Aufruf ohne ein "call" (also nur Name und ggf Pfad des nächsten Batches als "Befehl") eingeben ...Grüße
bastla