forgottenrealm
Goto Top

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?

Content-Key: 133901

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

Printed on: May 6, 2024 at 14:05 o'clock

Member: Biber
Biber Jan 20, 2010 at 10:55:57 (UTC)
Goto Top
Moin ForgottenAlmÖdi,

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:/=//%
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
Member: ForgottenRealm
ForgottenRealm Jan 20, 2010 at 18:59:05 (UTC)
Goto Top
Hi BibÖr face-smile

Danke, funktioniert super!


Allerdings habe ich jetzt ein weiteres Problem.

Ich möchte gerne eine Variable (wieder der Registrierungspfad) soweit ändern, dass die letzten 12 Zeichen (also "\Outlook.pst") entfernt werden, und ich nur den Pfad zum Ordner dort stehen habe.

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 ?face-smile
Member: Biber
Biber Jan 20, 2010 at 19:11:50 (UTC)
Goto Top
Moin ForgottenRealm,.

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 ?face-smile
ist der Papst katholisch?

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\
... und davon kannst du immer das letzte Zeichen (den Backslash) abschneiden und kompostieren.
[/Edit]
Member: ForgottenRealm
ForgottenRealm Jan 20, 2010 at 19:50:18 (UTC)
Goto Top
Die Zeile mit dem for %i in ("%pstpfad%") do @echo %~dpi funktioniert nicht so wie sie soll.

Ich bekomm da die Fehlermeldung: "pstpfad~dpi" kann syntaktisch an dieser Stelle nicht verarbeitet werden.
Member: Biber
Biber Jan 20, 2010 at 20:02:14 (UTC)
Goto Top
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.
(=21:01:26  D:\temp=)
>onetemp.bat
"pstpfad~dpi" ist syntaktisch an dieser Stelle nicht verarbeitbar.

Grüße
Biber
Member: ForgottenRealm
ForgottenRealm Jan 20, 2010 at 20:36:21 (UTC)
Goto Top
Ja so funktionierts face-smile

Allerdings hab ich nun auch noch ein anderes Problem bei der gesammten Datei;
@Title Find Outlook
@echo OFF

REM Optionen Finden
@set FILE=Outlook.pst
@set FINDLIST=Search_Outlook.txt
@set FINISH=Found_Outlook.txt
@set DRIVES=C
REM Optionen Registrierung anpassen
@set REGPATH=[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders]
@set STRINGNAME=Outlook
@set REGFILE=Outlook.reg
:: ------------------------------------------------------------------------------------------------

REM Löschen der temporären Dateien
@if exist %FINDLIST% @del /F /Q %FINDLIST% >NUL
@if exist %FINISH% @del /F /Q %FINISH% >NUL
@if exist %REGFILE% @del /F /Q %REGFILE% >NUL

REM Durchsuchen aller Laufwerke
cls
@echo.
@echo Durchsuche Laufwerke nach Datei %FILE% ...
@echo.

for %%i in (%DRIVES%) do (
	@dir /S %%i:\ >> %FINDLIST%
)

REM Finden der Datei in Index
cls
@echo.
@echo Durchsuche Index nach Dateipfad ...
@echo.

for /R "C:\" %%j in (%FILE%) do (  
	@if exist %%j @echo %%j> %FINISH%
)

REM Hinzufügen der gefundenen Informationen
cls
@echo.
@echo Fuege Dateipfad der Registrierung hinzu ...
@echo.

REM Einlesen des gefundenen Pfades in Variable
@set /P PATH=<%FINISH%

REM Entfernung der Datei
for %%i in ("%PATH%") do set PATH2=%%~dpi  
@set PATH3=%PATH2:~0,-1%

REM Umwandlung von \ in \\
@set PATHFINISH=%PATH3:\=\\%

REM Reg Add neu
REM Erstellung Registrierungsdatei
@echo Windows Registry Editor Version 5.00>>%REGFILE%
@echo.>>%REGFILE%
@echo %REGPATH%>>%REGFILE%
@echo.>>%REGFILE%
@echo "%STRINGNAME%"="%PATHFINISH%">>%REGFILE%  

@ping localhost -n 5>NUL

REM Hinzufügen der Registrierunsdatei
@regedit /S %REGFILE%

pause

REM Reg Add alt
REM reg add "%REGPATH%" /v "%STRINGNAME%" /t REG_SZ /d "%PATH%" /f  

REM Löschen der temporären Dateien
REM @if exist %FINDLIST% @del /F /Q %FINDLIST% >NUL
REM @if exist %FINISH% @del /F /Q %FINISH% >NUL
REM @if exist %REGFILE% @del /F /Q %REGFILE% >NUL

exit

An der Stelle, an der die Pause Funktion in Kraft tritt, scheinen Befehle wie ping, regedit, reg add ect nicht mehr zu funktionieren.

Woran liegt das ?


Weiterhin fällt mir grade noch auf, dass ich in der zweiten For-Schleife für die Laufwerke keine Variable habe, wie in der ersten. Wie kann ich die Laufwerke, auf denen nach der Outlook.pst gesucht werden soll, variabel halten ?
Member: Biber
Biber Jan 20, 2010 at 21:00:59 (UTC)
Goto Top
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
Member: bastla
bastla Jan 20, 2010 at 21:12:33 (UTC)
Goto Top
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
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  
reduzieren (OK, damit wird nicht, wie in Deiner Version, die erste, sondern die letzte passende Datei gefunden - aber wenn's eh nur eine ist ... face-wink; 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 "exit"
(Du musst Dich aber nicht speziell angesprochen fühlen - ich denke nur laut vor mich hin ...)
Member: ForgottenRealm
ForgottenRealm Jan 21, 2010 at 08:58:42 (UTC)
Goto Top
Danke bastla, damit funktionierts.

An die Geschichte mit der Path Variable hab ich gar nicht mehr gedacht, obwohl ich das Problem schon einmal hatte ...


Was das exit angeht;

Ich benutze oft mehrere Batch Dateien hintereinander, wobei die eine die andere aufruft und ohne ein Exit wird eine aufgerufene nicht von selber beendet.

Und bevor ich irgendwo ein Exit vergesse, auch wenn ich nicht weiss, ob ich die Datei später noch durch andere aufrufen will, mach ich lieber gleich überall ein Exit rein.
Member: bastla
bastla Jan 21, 2010 at 11:30:23 (UTC)
Goto Top
Hallo ForgottenRealm!
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
Member: ForgottenRealm
ForgottenRealm Jan 21, 2010 at 11:39:31 (UTC)
Goto Top
Mag sein, dass das mit Call so ist, ich starte solche Batchdateien aber meistens mit Start, wegen der Parameter für minimieren, warten bis beendet und einstellung der Priorität .
Member: bastla
bastla Jan 21, 2010 at 15:16:06 (UTC)
Goto Top
Hallo ForgottenRealm!
ich starte solche Batchdateien aber meistens mit Start
Ist ein Argument face-smile - und so gesehen wohl bequemer, "exit" zu verwenden, als beim Start ein "cmd /c" voranzustellen ...

Grüße
bastla