132749
Goto Top

Registrierungtyp abgleichen per Batch

Hallo,

ich benötige wieder einmal eure Unterstützung!
Das nachfolgende Script soll erst ausgeführt werden wenn der Registrierungswert "2017" vorhanden ist!

Hinzugefügt werden soll nachfolgende Abfrage in das vorhandene Script:

HKLM\SOFTWARE\myProgramm "Version" reg_sz "2017"

Wie muss man da vorgehen?
Ich habe bereits das eine oder andere gegoogelt aber zu einem Ergebnis bin ich leider nicht gekommen!

@echo off &setlocal

set "key=HKLM\SOFTWARE\myProgramm"  
set "value=Drive"  
set "validdata=CDEFX"  

set "drive="  
for /f "tokens=3" %%i in ('2^>nul reg query "%key%" /v "%value%" ^| findstr /reic:"\<[%validdata%]:*"') do set "drive=%%i"  
if not defined drive (
  echo Laufwerksbuchstabe ist nicht in %validdata% oder Key existiert nicht.
  pause
  exit /b
)
set "drive=%drive:~,1%:"  

set "BEFOREDATE=%date:* =%"  
date 11-01-2000

Start "" "%drive%\Programme\myProgramm\Start.exe" "%drive%\Programme\myProgramm\Start.INI"  

ping -n 10 127.0.0.1 > NUL 2>&1
date %BEFOREDATE%

Content-ID: 359579

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

Ausgedruckt am: 22.11.2024 um 20:11 Uhr

135051
135051 31.12.2017 aktualisiert um 21:24:53 Uhr
Goto Top
reg query "HKLM\SOFTWARE\myProgramm" /v Version /f "2017" /d /e /t REG_SZ >nul 2>&1&& (  
    REM tu hier was
)
Gruß @135051
132749
132749 31.12.2017 um 16:58:14 Uhr
Goto Top
@ squash,
dann müsste es so aussehen wenn ich es richtig interpretiere wobei ich vermute das noch etwas fehlt?
Kann man anstelle von REM tu hier was das nachfolgende einfügen wenn der entsprechende "Typ" nicht vorhanden bzw falsch ist?

echo Version 2017 existiert nicht.
ping -n 10 127.0.0.1 > NUL 2>&1
exit /b

@echo off &setlocal

reg query "HKLM\SOFTWARE\myProgramm" /v Version /f "2017" /e /t REG_SZ && (  
REM tu hier was
)

set "key=HKLM\SOFTWARE\myProgramm"  
set "value=Drive"  
set "validdata=CDEFX"  

set "drive="  
for /f "tokens=3" %%i in ('2^>nul reg query "%key%" /v "%value%" ^| findstr /reic:"\<[%validdata%]:*"') do set "drive=%%i"  
if not defined drive (
  echo Laufwerksbuchstabe ist nicht in %validdata% oder Key existiert nicht.
  pause
  exit /b
)
set "drive=%drive:~,1%:"  

set "BEFOREDATE=%date:* =%"  
date 11-01-2000

Start "" "%drive%\Programme\myProgramm\Start.exe" "%drive%\Programme\myProgramm\Start.INI"  

ping -n 10 127.0.0.1 > NUL 2>&1
date %BEFOREDATE%
135051
135051 31.12.2017 aktualisiert um 21:25:09 Uhr
Goto Top
dann müsste es so aussehen wenn ich es richtig interpretiere
Nope. Entweder deine Schritte innerhalb von den Klammern einfügen oder eben das ganze stattdessen negieren und so am Anfang einfügen.
reg query "HKLM\SOFTWARE\myProgramm" /v Version /f "2017" /d /e /t REG_SZ >nul 2>&1 || exit  
132749
132749 31.12.2017 um 19:47:08 Uhr
Goto Top
Hmm,
das verstehe ich jetzt nicht!

Ob vorweg oder in der ( ) der Befehl wird so nicht ausgeführt wie es sollte!
Naja, dann muss ich mich noch etwas gedulden und google in Anspruch nehmen!

Vielen Dank für deine Hilfe
135051
135051 31.12.2017 aktualisiert um 21:25:20 Uhr
Goto Top
Tja wenn du noch nie was von delayed expansion gehört hast wenn du Variablen innerhalb von Klammern setzt, ist klar daß es nicht will.
Deswegen beschäftige dich etwas damit dann verstehst du es auch face-smile, brauchst du hier aber wenn du die letzte Variante nützt auch nicht.
@echo off &setlocal

reg query "HKLM\SOFTWARE\myProgramm" /v Version /f "2017" /d /e /t REG_SZ >nul 2>&1 || exit  

set "key=HKLM\SOFTWARE\myProgramm"  
set "value=Drive"  
set "validdata=CDEFX"  

set "drive="  
for /f "tokens=3" %%i in ('2^>nul reg query "%key%" /v "%value%" ^| findstr /reic:"\<[%validdata%]:*"') do set "drive=%%i"  
if not defined drive (
  echo Laufwerksbuchstabe ist nicht in %validdata% oder Key existiert nicht.
  pause
  exit /b
)
set "drive=%drive:~,1%:"  

set "BEFOREDATE=%date:* =%"  
date 11-01-2000

Start "" "%drive%\Programme\myProgramm\Start.exe" "%drive%\Programme\myProgramm\Start.INI"  

ping -n 10 127.0.0.1 > NUL 2>&1
date %BEFOREDATE%
132749
132749 31.12.2017 um 20:28:56 Uhr
Goto Top
Soweit war ich schon aber das funktionierte nicht und darum habe ich den Beitrag hier "NEU" gepostet!
Wenn ich das so mache dann startet der zweite Teil den ich ja schon habe trotzdem mit oder ohne den Wert "2017"!

Ich möchte aber das der erste Teil "2017" erst abgefragt wird und wenn dieser nicht stimmt dann soll das Script mit einer Fehlermeldung (wie im zweiten Teil) beendet wird! Ist der erste Teile "2017" richtig dann soll es mit dem zweiten Teil weitergehen!
135051
135051 31.12.2017 aktualisiert um 21:25:42 Uhr
Goto Top
Lese deinen Satz nochmal in Ruhe durch.
Die Zeile lässt das Skript nur weiterlaufen wenn es einen REG_SZ Wert mit dem Namen Version gibt der den Inhalt "2017" hat, ansonsten beendet es sich ... so wie du wolltest ansonsten ist deine Schilderung missverständlich, hier läuft das.
132749
132749 31.12.2017 um 23:37:57 Uhr
Goto Top
Wenn ich die Zeile einfüge dann läuft das Script trotzdem weiter warum auch immer!
Ich habe das mit #### = 2016/2017/2018 probiert!


reg query "HKLM\SOFTWARE\Wow6432Node\myProgramm" /v Version /f "####" /e /t REG_SZ >nul 2>&1 || exit  
registry
Kriegstreiber
Kriegstreiber 01.01.2018 aktualisiert um 04:46:57 Uhr
Goto Top
Ich würde das jetzt so machen:

@echo off
for /f "skip=2 tokens=3" %%I in ('2^>nul reg query "HKLM\SOFTWARE\myProgramm" /v Version /reg:32') do set VERSION=%%I  
if "%VERSION%"=="2017" (  
	@echo off &setlocal

	set "key=HKLM\SOFTWARE\myProgramm"  
	set "value=Drive"  
	set "validdata=CDEFX"  

	set "drive="  
	for /f "tokens=3" %%i in ('2^>nul reg query "%key%" /v "%value%" ^| findstr /reic:"\<[%validdata%]:*"') do set "drive=%%i"  
	if not defined drive (
		echo Laufwerksbuchstabe ist nicht in %validdata% oder Key existiert nicht.
		pause
		exit /b
	)
	set "drive=%drive:~,1%:"  

	set "BEFOREDATE=%date:* =%"  
	date 11-01-2000

	Start "" "%drive%\Programme\myProgramm\Start.exe" "%drive%\Programme\myProgramm\Start.INI"  

	ping -n 10 127.0.0.1 > NUL 2>&1
	date %BEFOREDATE%
)

Habe das leicht angepasst, das er bei 64-Bit an der richtigen Ecke sucht. Da du anscheinend kein Delayed Expansion nutzen willst gehts so auch ohne. Du du jetzt die "2017" als Variable hast kannst jetzt alles damit anstellen, z.B das == durch LSS/GTR ersetzen, dass das Script nur ausgeführt wird wenn die neue Version größer/kleiner ist.
132749
132749 01.01.2018 um 08:51:35 Uhr
Goto Top
Guten Morgen und ein frohes neues Jahr 2018!
Leider funktioniert das auch nicht wirklich wobei der erste Teil den anschein hat zu funktionieren aber dann bleibt er beim zweiten Teil stehen obwohl
dieser ja bereits funktionierte!
colinardo
colinardo 01.01.2018 aktualisiert um 11:56:47 Uhr
Goto Top
Servus @132749,
bei meinen Vorgängern haben sich einige Fehler eingeschlichen, bei @135051 hat der reg query auch positive Rückmeldung gegeben wenn nur ein Version Eintrag egal welchen Jahres vorhanden war und @Kriegstreiber hat hier vergessen delayed expansion einzuschalten und "!" als Variablenbegrenzer zu nutzen.

Übernehme folgende Zeile in den Kopf deines vorhandenen Skripts und du hast das gewünschte Verhalten:
reg query "HKLM\SOFTWARE\WOW6432Node\myprogram" /v Version | findstr 2017 >nul 2>&1 || (echo Registryeintrag nicht gefunden &exit /b)  
Frohes Neues
Grüße Uwe
132749
132749 01.01.2018 um 11:41:08 Uhr
Goto Top
@ colinardo,
auch deine Zeile funktioniert leider nicht!

Mein Script im 1ten Posting bzw. das nachfolgende funktioniert einwandfrei aber sobald ich Änderungen vornehme dann geht nichts mehr so wie es soll! Vielleicht kann jemand das vollständige Script posten um Missverständnisse auszuschliessen!

Hinzugefügt werden soll nachfolgende Abfrage in das vorhandene Script:
HKLM\SOFTWARE\myProgramm "Version" reg_sz "2017" + eine entsprechende Meldung wie in den Zeilen 11-19

@echo off &setlocal

set "key=HKLM\SOFTWARE\Wow6432Node\myProgramm"  
set "value=Drive"  
set "validdata=CDEFX"  

set "drive="  
for /f "tokens=3" %%i in ('2^>nul reg query "%key%" /v "%value%" ^| findstr /reic:"\<[%validdata%]:*"') do set "drive=%%i"  
if not defined drive (

  echo Mein Text1:
  echo Mein Text2!
  echo.
  echo Mein Text3:
  echo Mein Text4!
  echo.
  echo.
  ping -n 20 127.0.0.1 > NUL 2>&1
  exit /b
)

set "drive=%drive:~,1%:"  

set "BEFOREDATE=%date:* =%"  
date 01-01-2017

Start "" "%drive%\myProgramm\start.exe"  

ping -n 10 127.0.0.1 > NUL 2>&1
date %BEFOREDATE%
colinardo
colinardo 01.01.2018 aktualisiert um 12:07:05 Uhr
Goto Top
Zitat von @132749:

@ colinardo,
auch deine Zeile funktioniert leider nicht!
Doch, das tut sie natürlich selbstverständlich! Sie wurde hier extra vorher nochmal getestet!
Du wendest sie offensichtlich falsch an oder es hat sich bei dir noch ein Fehler eingeschlichen. Ein "@echo on" in deinem Skript wird es dir zeigen.

Hinzugefügt werden soll nachfolgende Abfrage in das vorhandene Script:
HKLM\SOFTWARE\myProgramm "Version" reg_sz "2017" + eine entsprechende Meldung wie in den Zeilen 11-19
Genau das tut die obige Zeile.

Hier also im Gesamten nochmal:
@echo off &setlocal

set "key=HKLM\SOFTWARE\Wow6432Node\myProgramm"  

reg query "%key%" /v Version | findstr 2017 >nul 2>&1 || (echo Registryeintrag nicht gefunden, Programm wird beendet &exit /b)  

set "value=Drive"  
set "validdata=CDEFX"  
set "drive="  
for /f "tokens=3" %%i in ('2^>nul reg query "%key%" /v "%value%" ^| findstr /reic:"\<[%validdata%]:*"') do set "drive=%%i"  
if not defined drive (

  echo Mein Text1:
  echo Mein Text2!
  echo.
  echo Mein Text3:
  echo Mein Text4!
  echo.
  echo.
  ping -n 20 127.0.0.1 > NUL 2>&1
  exit /b
)

set "drive=%drive:~,1%:"  

set "BEFOREDATE=%date:* =%"  
date 01-01-2017

Start "" "%drive%\myProgramm\start.exe"  

ping -n 10 127.0.0.1 > NUL 2>&1
date %BEFOREDATE%

Mein hinzugefügte Zeile:
reg query "%key%" /v Version | findstr 2017 >nul 2>&1 || (echo Registryeintrag nicht gefunden, Programm wird beendet &exit /b)  
Kannst du natürlich auch übersichtlicher so schreiben und deine gewünschten Befehle in den Klammern untereinander hinzufügen
reg query "%key%" /v Version | findstr 2017 >nul 2>&1 || (  
    echo Registryeintrag nicht gefunden, Programm wird beendet 
    exit /b
)

So hoffe das klärt deine Fragen nun endgültig.

Viel Erfolg weiterhin.
Grüße Uwe
Kriegstreiber
Kriegstreiber 01.01.2018 aktualisiert um 12:35:03 Uhr
Goto Top
Absichtlich weggelassen, da ich es so verstanden habe, das er Delayed Extensions nicht nutzen will. Wenn er am Anfang seiner Batch setlocal setzt ist alles in Butter. Er muss ja %VERSION% nirgends anders mehr auflösen. Ansonsten kann er ja Delayed Expansion anmachen und das %VERSION% durch !VERSION! ersetzen, ich habe diese Funktion aber meist aus, mache die nur an wenn ich die wirklich brauche weil man damit auch viele Nachteile hat. Zudem vergesst ihr immer den Switch /reg:32 zu nutzen um das 32-Bit Reg anzusprechen, da die Keys bei ihm ja anscheinend in "WOW6432Node" sitzen und ihr mit dem 64-Bit reg da ewig unter "Software" suchen könnt ;).
132749
132749 01.01.2018 aktualisiert um 13:26:59 Uhr
Goto Top
Sorry mein Fehler da der Registryeintrag einen anderen Pfad hat!

@echo off &setlocal

set "key=HKLM\SOFTWARE\Wow6432Node\myProgramm\Programm1"  
reg query "%key%" /v Version | findstr 2017 >nul 2>&1 || (  

  echo Mein Text1:
  echo Mein Text2!
  echo.
  echo Mein Text3:
  echo Mein Text4!
  echo.
  echo.
  ping -n 20 127.0.0.1 > NUL 2>&1
  exit /b

)

set "key=HKLM\SOFTWARE\Wow6432Node\myProgramm"  
set "value=Drive"  
set "validdata=CDEFX"  
set "drive="  

for /f "tokens=3" %%i in ('2^>nul reg query "%key%" /v "%value%" ^| findstr /reic:"\<[%validdata%]:*"') do set "drive=%%i"  
if not defined drive (

  echo Mein Text5:
  echo Mein Text6!
  echo.
  echo Mein Text7:
  echo Mein Text8!
  echo.
  echo.
  ping -n 20 127.0.0.1 > NUL 2>&1
  exit /b
)

set "drive=%drive:~,1%:"  

set "BEFOREDATE=%date:* =%"  
date 01-01-2017

Start "" "%drive%\myProgramm\start.exe"  

ping -n 10 127.0.0.1 > NUL 2>&1
date %BEFOREDATE%

Was müsste denn noch geändert werden damit das Script auch auf einem 32-Bit System läuft denn das habe ich nicht berücksichtigt da ich ein 64-Bit System habe aber die Kollegen noch auf 32-Bit System arbeiten?


Vielen Dank für die Mühe die ich Euch bereitet habe
colinardo
colinardo 01.01.2018 aktualisiert um 14:44:15 Uhr
Goto Top
Was müsste denn noch geändert werden damit das Script auch auf einem 32-Bit System läuft
S.o. Kriegstreibers Kommentar, den Registry-Pfad stattdessen unter "HKLM\SOFTWARE\myprogramm\Programm1" ansprechen und den Parameter /reg:32 setzen, oder alternativ die Umgebungsvariable checken und Key Variable setzen
IF %PROCESSOR_ARCHITECTURE% == x86 (
    REM Hier x86 code
 )
132749
132749 01.01.2018 aktualisiert um 14:13:18 Uhr
Goto Top
Danke für den Hinweis aber das ist zuviel für mich da ich mich mit dem Script schreiben nicht so auskenne!
Die einfachen Sachen bekomme ich hin aber das was ihr hier so im Forum habt ist ein bischen zuviel INPUT für mich!

Für die Kollegen schreibe ich dann das Script ohne Wow6432Node und gut ist!

Hut ab für Eure Kenntnisse und vielen, vielen Dank für die Unterstützung
colinardo
Lösung colinardo 01.01.2018 aktualisiert um 15:03:15 Uhr
Goto Top
Nun ja einfaches lesen hätte zwar auch gereicht, aber na gut ändere meine beiden Zeilen so ab
set "key=HKLM\SOFTWARE\myProgramm\Programm1"  
reg query "%key%" /v Version /reg:32 | findstr 2017 >nul 2>&1 || (  
Bei Interesse an der Materie empfehle ich folgende Seite
https://msdn.microsoft.com/de-de/library/windows/desktop/aa384232(v=vs.8 ...

Wenn's das dann war bitte den Beitrag noch als gelöst markieren. Merci.
Kriegstreiber
Kriegstreiber 01.01.2018 um 14:43:51 Uhr
Goto Top
Leider bringt die Prozessor Architektur Abfrage nix, da ich auch auf AMD64 Prozessoren ein 32-Bit System fahren kann. Bei reg ist ja schön da gibts den Switch, leider gibt es sowas nicht für regedit.

Alternativ, so löse ich das, nimm einen BAT to exe Converter, die exe arbeitet wieder in der 32-Bit Ebene und das ganze wäre endgültig gelöst.
colinardo
colinardo 01.01.2018 aktualisiert um 14:51:56 Uhr
Goto Top
Zitat von @Kriegstreiber:

Leider bringt die Prozessor Architektur Abfrage nix, da ich auch auf AMD64 Prozessoren ein 32-Bit System fahren kann.
Les doch dazu bitte mal
WOW64 Implementation Details
Die Variable bestimmt nicht die Architektur des "Prozessors" sondern in welchem Kontext der Prozess läuft.


Alternativ, so löse ich das, nimm einen BAT to exe Converter
Arghhhh., besser nicht. Virenscanner lieben solche Files ...
rubberman
rubberman 01.01.2018 um 14:50:41 Uhr
Goto Top
Zitat von @Kriegstreiber:
nimm einen BAT to exe Converter
face-sad
Sorry, aber wenn es hier Downvotes gäbe ...

Steffen
132749
132749 01.01.2018 aktualisiert um 15:05:52 Uhr
Goto Top
Wenn ich nun die Zeile 3+4 anpasse dann muss ich auch die Zeile 18+23 anpassen ansonsten würde der zweite Teil (32-Bit) nicht funktionieren! Oder sehe ich das wieder falsch? Die Zeile 18+23 müsste dann wie folgt aussehen! ODER?

@echo off &setlocal

set "key=HKLM\SOFTWARE\myProgramm\Programm1"  
reg query "%key%" /v Version /reg:32 | findstr 2017 >nul 2>&1 || (  

  echo Mein Text1:
  echo Mein Text2!
  echo.
  echo Mein Text3:
  echo Mein Text4!
  echo.
  echo.
  ping -n 20 127.0.0.1 > NUL 2>&1
  exit /b

)

set "key=HKLM\SOFTWARE\myProgramm"  
set "value=Drive"  
set "validdata=CDEFX"  
set "drive="  

for /f "tokens=3" %%i in ('2^>nul reg query "%key%" /v "%value%" /reg:32 ^| findstr /reic:"\<[%validdata%]:*"') do set "drive=%%i"  
if not defined drive (

  echo Mein Text5:
  echo Mein Text6!
  echo.
  echo Mein Text7:
  echo Mein Text8!
  echo.
  echo.
  ping -n 20 127.0.0.1 > NUL 2>&1
  exit /b
)

set "drive=%drive:~,1%:"  

set "BEFOREDATE=%date:* =%"  
date 01-01-2017

Start "" "%drive%\myProgramm\start.exe"  

ping -n 10 127.0.0.1 > NUL 2>&1
date %BEFOREDATE%
Kriegstreiber
Kriegstreiber 01.01.2018 um 14:59:19 Uhr
Goto Top
Es gibt mittlerweile sehr gute und für aufwendige Scripts die in einer 32-Bit Umgebung laufen sollen sind die OK. Wenn du die nicht magst ist das ja Ok.
colinardo
colinardo 01.01.2018 aktualisiert um 15:03:32 Uhr
Goto Top
Ja klar, war ja nur auf meinen Code eingegangen .
Kriegstreiber
Kriegstreiber 01.01.2018 um 15:00:55 Uhr
Goto Top
Genau, so sollte das funktionieren jetzt.
132749
132749 01.01.2018 um 15:07:39 Uhr
Goto Top
Noch einmal vielen, vielen Dank für Eure Hilfe!
rubberman
rubberman 01.01.2018 um 15:52:24 Uhr
Goto Top
Zitat von @Kriegstreiber:
Es gibt mittlerweile sehr gute
Nein, gibt es nicht. Und die Tatsache dass diese Tools dein Script in der WOW64 VM ausführen, ist eher eines der unerwünschten Nebeneffekte als ein Feature. (Wobei unterschiedliche Tools das auch anders händeln könnten, was noch eine Unsicherheit mehr ist.)

Wenn du die nicht magst ist das ja Ok.
"To Exe Converter" für mehrere zusammenhängende vbs- und batch-Skripte?
Es gibt keinen Grund sie zu "mögen". Das gilt nicht nur für mich.

Steffen
Kriegstreiber
Kriegstreiber 01.01.2018 aktualisiert um 21:53:56 Uhr
Goto Top
Bat to Exe kannst auch in die Tonne kloppen, für was gutes musste schon ein paar Euro zahlen ;)
http://www.battoexeconverter.com/buypro.html

Den nutze ich und hier ist z.B ein Virustotal Log meines letzten Tools das ich auf die Menschheit losliess:
https://www.virustotal.com/#/file/3e63e4a6e70bc5ab0b2b16d8de870636fd88a2 ...

Hier das Script, das du siehst, das ich da nicht eben nur nen 2 zeiler compiliert habe:
https://pastebin.com/tdq7ySgy

Und wenn da ein Malwarescanner anschlägt wäre es ratsam sich da mal einen vernünftigen anzuschaffen ;)

Womit du natürlich Recht hast ist, das ist nichts um ein Batch Script zu schützen. Das wird temporär im Temp folder ausgelagert.
Da müsste man andere Wege gehen, aber 100% kannst keines schützen. Auch das Administrator Manifest ist manchmal Gold wert ;), gerade wenn man mit Registry Einträgen rumspielt :D.
132749
132749 01.01.2018 um 17:16:39 Uhr
Goto Top
So, nun benötige ich doch noch einmal Eure Hilfe!
Wie kann ich in der Registry einen Eintrag hinterlassen der beiden Versionen (/reg:32) zugutekommt?
REG ADD "HKLM\Software\myProgramm" /v "Date" /t REG_SZ /d "01.01.2018" /F  
Kriegstreiber
Lösung Kriegstreiber 01.01.2018 um 17:20:11 Uhr
Goto Top
REG ADD "HKLM\Software\myProgramm" /v "Date" /t REG_SZ /d "01.01.2018" /F /reg:32  

Als Admin aber starten!