kkboy94
Goto Top

Fehlersuche - Falsche Aussgabe in txt

Hallo Forum,

ich habe letztens eine Batch geschrieben, welche einen Wert aus der Registry aussliest und ihn schön verpackt in eine txt speichert. Es sind auch noch andere Funktionen enthalten, wie z.B. eine Backup Funktion oder eine Wiederherstellmöglichkeit der gesicherten Daten.
Als erstes mal den Code der kompletten Datei:
@echo off & setlocal
chcp 1252>nul
set ue=ü
set ae=ä
set oe=ö
set Uue=Ü
set Aae=Ä
set Ooe=Ö
set ss=ß
chcp 850>nul
title Backupper f%ue%r CoD4

echo Das Programm wird gestartet.
echo.
echo Bitte Warten...
echo.
echo. 
echo. 

set "installpath="  

cd %CD%
if exist Backup\Players/nul goto check 
md "%CD%\Backup\Players"  

:check
if exist Backup/nul goto cont 
md "%CD%\Backup"  
goto cont

:restart1
echo Sie haben eine leere Auswahl getroffen. 
echo Bitte die Auswahl wiederholen.
echo.
:cont
echo Taste S = Key und die Profile sichern
echo Taste W = Profile wiederherstellen
echo Taste X = Programm schlie%ss%en
echo.
set "question1="  
set /p question1=Bitte S  oder  W  oder  X  eingeben: 
if not defined question1 goto :restart1
if /i %question1:~,1%==S goto :backup
if /i %question1:~,1%==W goto :copy
if /i %question1:~,1%==x goto :endalt
echo.
echo Sie haben keine der 3 Aktionen gew%ae%hlt.
echo Das Programm wird nun geschlossen.
ping localhost -n 5 >nul
goto :eof

:copy
echo Die Profile werden nun wiederhergestellt:
REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Activision\Call of Duty 4" /V InstallPath >NUL 2>&1  
IF %ERRORLEVEL% == 1 (
   GOTO enderror
) ELSE (
   FOR /F "Skip=2 tokens=2*" %%i IN ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Activision\Call of Duty 4" /V "InstallPath"') do set "installpath=%%j"  
)
xcopy "%CD%\Backup\Players" "%installpath%players" /S /E /Y /I /Q  
if %errorlevel% == 1 (
 goto enderror
 ) else (
 echo Die Dateien wurden erfolgreich kopiert.
)
goto end


:backup
set "codkey="  
REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Activision\Call of Duty 4" /V codkey >NUL 2>&1  
IF %ERRORLEVEL% == 1 (
   GOTO enderror
) ELSE (
FOR /F "Skip=2 tokens=2*" %%i IN ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Activision\Call of Duty 4" /V "codkey"') do set "codkey=%%j"  
if not defined codkey goto :enderror
echo #%codkey%#
set "key=%codkey:~,4%-%codkey:~4,4%-%codkey:~8,4%-%codkey:~12,4%-%codkey:~16%"  
echo Ihr aktueller Key ist %key%
echo Er befindet sich im Backup-Ordner
> "Backup\codkey.txt" echo Der gesicherte Schlüssel ist:  
>>"Backup\codkey.txt" echo %key%  
>>"Backup\codkey.txt" echo Bewahren sie den Key bis zu nächsten Neuinstallation von CoD4 auf.  
>>"Backup\codkey.txt" echo Sie können den Key dann wieder zu Installation nutzen, und haben zudem die passenden Profile für den Key.  
)

echo Die Profile werden nun gesichert:
REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Activision\Call of Duty 4" /V InstallPath >NUL 2>&1  
IF %ERRORLEVEL% == 1 (
   GOTO enderror
) ELSE (
   FOR /F "Skip=2 tokens=2*" %%i IN ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Activision\Call of Duty 4" /V "InstallPath"') do set "installpath=%%j"  
)
xcopy "%installpath%\players" "%CD%\Backup\Players\" /S /E /Y /I /Q  
if %errorlevel% == 1 (
 goto enderror
 ) else (
 echo Die Dateien wurden erfolgreich kopiert.
)
goto :end

:endalt
echo Sie haben das Programm ge%oe%ffnet, um es zu schlie%ss%en
echo Das ist eine berauschende Logik
echo Danke f%ue%r die Benutzung meines Programms
echo Das Programm wird nun geschlossen.
ping localhost -n 5 >nul
goto :eof
:end
echo Danke f%ue%r die Benutzung meines Programms
echo Der Vorgang wurde abgeschlossen
echo Beliebige Taste zum Beenden dr%ue%cken.
pause >nul
goto :eof
:enderror
echo ERROR:Es ist ein Fehler aufgetreten!
echo Das Programm wird nun geschlossen.
ping localhost -n 5 >nul
goto :eof


Nun kommt bei der codkey.txt folgendes raus
 Der gesicherte Schlüssel ist: 
ECHO ist ausgeschaltet (OFF). 
Bewahren sie den Key bis zu nächsten Neuinstallation von CoD4 auf. 
Sie können den Key dann wieder zu Installation nutzen, und haben zudem die passenden Profile für den Key.
In der Batch wird der Key auch nicht genannt.


Den Inhalt der Zeile 77 hat mir bastla schon per PN geschickt.
Die Variable scheint leer zu sein, was aber eigentlich nicht sein kann da die batch beim Ausführen nicht zu :enderror springt.

Könnt ihr den Fehler entdecken und mir helfen ihn zu beheben?
Danke schonmal


MfG Karsten

Content-ID: 144812

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

Ausgedruckt am: 05.11.2024 um 18:11 Uhr

tag123
tag123 14.06.2010 um 18:01:21 Uhr
Goto Top
Glaube Zeile 70.
Da wird der variable %codkey% nur ein " zugewiesen.
kkboy94
kkboy94 14.06.2010 um 18:03:20 Uhr
Goto Top
Danke für die Antwort, aber in dieser Zeile wird die Variable nur zurückgesetzt (bekommt einen leeren Wert) und wird ja nachher anderweitig wieder gesetzt.

MfG Karsten
Miyamoto
Miyamoto 14.06.2010 um 18:04:37 Uhr
Goto Top
Hi,
ich würde mal statt den % Zeichen das ! Zeichen verwenden.
Das könnte helfen.

Edit: nach dem du das erste mal die Variable initialisiert hast

Gruß Miyamoto
kkboy94
kkboy94 14.06.2010 um 18:10:30 Uhr
Goto Top
Du meinst:
Alle % mit ! austauschen?
masterofdisaster09
masterofdisaster09 14.06.2010 um 18:45:23 Uhr
Goto Top
Moin!
Öffne mal eine Dos-Box und probiere mit folgender Zeile rum:
REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Activision\Call of Duty 4"
bzw.
REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Activision\Call of Duty 4" /V codkey
Da muss dann als Ausgabe der Key genannt werden. Wenn nicht, ist schon die Abfrage nicht stimmig. Heisst der Eintrag für den Key in der Registry tatsächlich codkey?
tag123
tag123 14.06.2010 um 19:19:20 Uhr
Goto Top
probier mal statt:
REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Activision\Call of Duty 4" /V codkey
dass:
REG QUERY "hklm\software\Activision\Call of Duty 4" /v codkey
Biber
Biber 14.06.2010 um 19:22:26 Uhr
Goto Top
Moin kkboy94,

nun ändere nicht überall gleichzeitig, weil ganz viele helfen wollen und alle ganz unterschiedliche Verdachtsmomente äußern...

In der Zeile 72 öffnest du ein "IF ( ... ) ELSE ( )" -Konstrukt, das rein optisch erst in Zeile 85 endet.
Für den Commandinterpreter CMD.exe ist es allerdings nach wie vor eine Befehlszeile.

Und da das Setzen einer Variable immer erst (für die CMD.exe) in der Folgezeile relevant wird, haben %codkey% und %key%,
die beide innerhalb einer Befehlszeile gesetzt werden und ausgelesen werden sollen, die falschen Werte.

Schau dir im Vergleich das IF-Konstrukt von Zeile 89-93 an... da klappt es, weil die innerhalb der Programmzeile gesetzte Variable erst nach dem Ende der Programmzeile wieder gelesen/verwendet wird.

--> also entweder "sauber" arbeiten == in einer Programmzeile die Variablen setzen, aber erst in der nächsten Programmzeile verwenden
--> oder aber mit "verzögerter Variablenauflösung", neudeutsch delayed expansion arbeiten.

Variante 1 ist meine Empfehlung in der Batch-Lernphase.

Da ich aber weiss, wie es 16jährige machen werden: EnableDelayedExpansion ist in der Hilfe zu SetLocal beschrieben.
Und dürfte auch über die Forumssuche ein paarmal gefunden werden.

Grüße
Biber
bastla
bastla 14.06.2010 um 19:31:10 Uhr
Goto Top
... wobei es ja genügen sollte, die Zeilen 71 - 74 (und die schließende Klammer in Zeile 85) durch die neue Zeile 71
REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Activision\Call of Duty 4" /V codkey >NUL 2>&1 || goto :enderror
zu ersetzen ...

(... und wenn Du schon dabei bist, entsorge auch gleich die Zeile 22 und alle weiteren sinnfreien %CD% ... )

Grüße
bastla

P.S.: Sorry - hatte vorhin wenig Zeit und daher nur einen flüchtigen Blick darauf geworfen ...
masterofdisaster09
masterofdisaster09 14.06.2010 um 19:31:14 Uhr
Goto Top
Ob du den Stammschlüssel ausschreibst oder die Kurzform nimmst, ist egal.
Biber
Biber 14.06.2010 um 19:47:18 Uhr
Goto Top
[OT]
Jepp, masterofdisaster,

Zitat von @masterofdisaster09:----
Ob du den Stammschlüssel ausschreibst oder die Kurzform nimmst, ist egal.
Genau das wollte ich doch auch nur ausdrücken ....es kommt nicht auf die Länge, sondern auf die richtige Technik und das Timing an..
[OT}
kkboy94
kkboy94 15.06.2010 um 15:17:41 Uhr
Goto Top
Danke für die Hilfen. Ich werds bei Gelegnheit mal testen.

MfG Karsten
Biber
Biber 15.06.2010 um 15:40:17 Uhr
Goto Top
Moin kkboy94,

Zitat von @kkboy94:
Danke für die Hilfen. Ich werds bei Gelegnheit mal testen.

MfG Karsten

hab ich jezz' nicht verstanden...
Du hast hier gepostet, weil der oben gepostete Batch abraucht.... nicht funktioniert oder so keinerlei Wert hat.

Entsprechend dem Titel "Fehlersuche... " sind auch schnell und zahlreich Hilfewillige gekommen und haben sich des Problems angenommen.

Nun biegst du einen knappen Tag später um die Ecke und schreibst :"ich werd bei Gelegenheit ma' testen.." ?????

Gestern war es noch ein Problem - heute hab ich es schon fast ganz vergessen?

Grüße
Biber

[Edit 17:42h] @kkboy94 Vielen Dank für die schnelle Rückmeldung und Klarstellung! Ich wollte/sollte auch nicht gleich überreagieren... [/Edit]
kkboy94
kkboy94 15.06.2010 um 17:18:16 Uhr
Goto Top
Entschuldigung, ich hatte mich nicht eindeutig ausgedrückt. Ich habe damit gemeint, dass ich die Lösungen alle mal ausprobieren werde, und schauen werde, welche die Richtige ist/war.
Es hat sich herausgestellt, dass du mit deiner Idee richtig lagst, und bastla dann halt noch so freundlich war, mir direkt eine kürzer und vorgefertigte Variante zu geben.

Ich habe mir dann auch nochmal deine Tipps zu Herzen genommen, und aufgeräumt:
@ echo off & setlocal
chcp 1252>nul
set ue=ü
set ae=ä
set oe=ö
set Uue=Ü
set Aae=Ä
set Ooe=Ö
set ss=ß
chcp 850>nul
title Backupper f%ue%r CoD4

echo Das Programm wird gestartet.
echo.
echo Bitte Warten...
echo.
echo. 
echo. 

echo ::._Ben%oe%tigte Variablen werden gesetzt_.::
echo.
echo Bitte Warten...
echo.
set "installpath="  
REG QUERY "hklm\SOFTWARE\Activision\Call of Duty 4" /V InstallPath >NUL 2>&1 || goto :enderror  
FOR /F "Skip=2 tokens=2*" %%i IN ('reg query "hklm\SOFTWARE\Activision\Call of Duty 4" /V "InstallPath"') do set "installpath=%%j"  
if not defined installpath goto :enderror

set "codkey="  
REG QUERY "hklm\SOFTWARE\Activision\Call of Duty 4" /V codkey >NUL 2>&1 || goto :enderror  
FOR /F "Skip=2 tokens=2*" %%i IN ('reg query "hklm\SOFTWARE\Activision\Call of Duty 4" /V "codkey"') do set "codkey=%%j"  
if not defined codkey goto :enderror

set "key="  
set "key=%codkey:~,4%-%codkey:~4,4%-%codkey:~8,4%-%codkey:~12,4%-%codkey:~16%"  

set "FS="  
set "FS=%temp%\GetFolderSize.vbs  

set "ZO="  
set "ZO=Backup\Players\profiles"  

set "Maxsize="  
set "Maxsize=0"  
echo ::._Variablen wurden erfolgreich gesetzt_.::
echo.
goto cont

:restart1
echo Sie haben eine leere Auswahl getroffen. 
echo Bitte die Auswahl wiederholen.
echo.
:cont
echo Taste S = Key und die Profile sichern
echo Taste W = Profile wiederherstellen
echo Taste X = Programm schlie%ss%en
echo.
set "question1="  
set /p question1=Bitte S  oder  W  oder  X  eingeben: 
if not defined question1 goto :restart1
echo.
if /i %question1:~,1%==S goto :backup
if /i %question1:~,1%==W goto :copy
if /i %question1:~,1%==x goto :endalt


:copy
if not exist Backup\Players\profiles/nul goto :nota 
echo WScript.Echo Int(CreateObject("Scripting.FileSystemObject").GetFolder(WScript.Arguments(0)).Size/1024/1024+.99)>%FS%  
for /f %%i in ('cscript //nologo %FS% "%ZO%"') do set OGr=%%i  
del %FS%
if %OGr% EQU %Maxsize% goto :nota
echo Die Profile werden nun wiederhergestellt:
xcopy "Backup\Players" "%installpath%players" /S /E /Y /I /Q  
if %errorlevel% == 1 goto :enderror
echo Die  Profile wurden erfolgreich wiederhergestellt.
goto end


:backup
echo.
echo ::._Ben%oe%tigte Verzeichnisse werden erstellt_.::
echo.
echo Bitte Warten...
echo.

md "Backup" 2>nul  
md "Backup\Players" 2>nul  

echo ::._Verzeichnisse wurden erfolgreich erstellt_.::
echo.
echo.
echo.
echo Ihr aktueller Key ist "%key%"  
echo Er befindet sich im Backup-Ordner (codkey.txt)
> "Backup\codkey.txt" echo Der gesicherte Schlüssel ist:  
>>"Backup\codkey.txt" echo %key%  
>>"Backup\codkey.txt" echo Bewahren sie den Key bis zu nächsten Neuinstallation von CoD4 auf.  
>>"Backup\codkey.txt" echo Sie können den Key dann wieder zu Installation nutzen, und haben zudem die passenden Profile für den Key  
echo.
echo Die Profile werden nun gesichert:
xcopy "%installpath%\players" "Backup\Players\" /S /E /Y /I /Q  
if %errorlevel% == 1 goto :enderror
echo Die  Profile wurden erfolgreich gesichert.
goto :end


:endalt
echo Sie haben das Programm ge%oe%ffnet, um es zu schlie%ss%en
echo Das ist eine berauschende Logik
echo Danke f%ue%r die Benutzung meines Programms
echo Das Programm beendet sich von selbst
ping localhost -n 5 >nul
goto :eof
:end
color 2F
echo.
echo Der Vorgang wurde abgeschlossen
echo Danke f%ue%r die Benutzung meines Programms
if /i %question1:~,1%==S goto :S
if /i %question1:~,1%==W goto :W
:S
color 2F
echo Der Ordner "Backup" wird beim Beenden ge%oe%ffnet  
echo Beliebige Taste zum Beenden dr%ue%cken
pause >nul
start "Backup" "Backup"  
goto :eof
:W
color 2F
echo Der CoD4-Ordner wird beim Beenden ge%oe%ffnet
echo Beliebige Taste zum Beenden dr%ue%cken
pause >nul
start "CoD4" "%installpath%"  
goto :eof
:enderror
color 4F
echo !!ERROR:Es ist ein Fehler aufgetreten!!
echo Das Programm wird nun geschlossen
ping localhost -n 5 >nul
goto :eof
:nota
color 4F
echo !!ERROR:Es sind keine Profile vorhanden!!
echo Das Programm wird nun geschlossen
ping localhost -n 5 >nul
pause >nul
goto :eof

DANKE Nochmal allen die sich die Mühe geamcht haben, den Fehler zu finden.

MfG Karsten