Umrechung Wert in Hex -> Batch

R

reaper2k11

Gast
Ich bastel zur Übung wieder etwas an einer Batch Datei rum.
Ziel ist es diesmal Laufwerke auszublenden. Über eine Eingabeabfrage gibt man die Buchstaben der zu sperrenden LW's ein; solange bis man es mit "#" beendet. Also eine Art goto Schleife

Dann soll mit einer IF Abfrage der Wert addiert werden. Was mir noch fehlt ist der Teil der Ausgabe, also die Umrechnung eines Wertes in HEX.

Code:
@echo off
del key.reg /F

set letterA=1
set letterB=2
set letterC=4
set letterD=8
set letterE=16
set letterF=32
set letterG=64
set letterH=128
set letterI=256
set letterJ=512
set letterK=1024
set letterL=2048
set letterM=4096
set letterN=8192
set letterO=16384
set letterP=32768
set letterQ=65536
set letterR=131072
set letterS=262144
set letterT=524288
set letterU=1048576
set letterV=2097152
set letterW=4194304
set letterX=8388608
set letterY=16777216
set letterZ=33554432

set wert=0

echo Eingabe mit # beenden

:eingabe
set /p var=zu sperrende Buchstaben (a-z, klein) eingeben:

#Berechnung
if %var% == "a" (
  set /A wert=%wert%+%letterA%
) else (
  if %var% == "b" (
  set /A wert=%wert%+%letterB%
) else (
  if %var% == "c" (
  set /A wert=%wert%+%letterC%
) else (
  if %var% == "d" (
  set /A wert=%wert%+%letterD%
) else (
  if %var% == "e" (
  set /A wert=%wert%+%letterE%
) else (
  if %var% == "f" (
  set /A wert=%wert%+%letterF%
) else (
  if %var% == "g" (
  set /A wert=%wert%+%letterG%
) else (
  if %var% == "h" (
  set /A wert=%wert%+%letterH%
) else (
  if %var% == "i" (
  set /A wert=%wert%+%letterI%
) else (
  if %var% == "j" (
  set /A wert=%wert%+%letterJ%
) else (
  if %var% == "k" (
  set /A wert=%wert%+%letterK%
) else (
  if %var% == "l" (
  set /A wert=%wert%+%letterL%
) else (
  if %var% == "m" (
  set /A wert=%wert%+%letterM%
) else (
  if %var% == "n" (
  set /A wert=%wert%+%letterN%
) else (
  if %var% == "o" (
  set /A wert=%wert%+%letterO%
) else (
  if %var% == "p" (
  set /A wert=%wert%+%letterP%
) else (
  if %var% == "q" (
  set /A wert=%wert%+%letterQ%
) else (
  if %var% == "r" (
  set /A wert=%wert%+%letterR%
) else (
  if %var% == "s" (
  set /A wert=%wert%+%letterS%
) else (
  if %var% == "t" (
  set /A wert=%wert%+%letterT%
) else (
  if %var% == "u" (
  set /A wert=%wert%+%letterU%
) else (
  if %var% == "v" (
  set /A wert=%wert%+%letterV%
) else (
  if %var% == "w" (
  set /A wert=%wert%+%letterW%
) else (
  if %var% == "x" (
  set /A wert=%wert%+%letterX%
) else (
  if %var% == "y" (
  set /A wert=%wert%+%letterY%
) else (
  if %var% == "z" (
  set /A wert=%wert%+%letterZ%
) else (
  if %var% == "#" (
  goto ausgabe
) else (
  goto eingabe
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)

:ausgabe
#wert in Hex umwandeln

echo Ausgabe zur Kontrolle:
echo wert=%wert%

pause


echo [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer] >>key.reg
echo "NoDrives"=dword:%hex% >>key.reg

key.reg

Jemand eine Idee :)
 
Oh mist da hätte ich auch drauf kommen können :/
http://technet.microsoft.com/de-de/sysinternals/bb896736(en-us).aspx
Anstatt des langen Codes würde ich auf ein Hilfsprogramm zugreifen.

Bei eingabe von hex2dec.exe 500:
Code:
Hex2dec - converts hex to decimal and vice versa
Copyright (C) 2004 Mark Russinovich
Sysinternals - www.sysinternals.com

500 = 0x1F4

Jetzt möchte ich, dass er ab der 5. zeile nach dem '=' den Wert ausgibt.
 
FOR /f "tokens=2 delims== skip=5" %%f IN ('hex2dec.exe 500') DO set hex=%%f
echo %hex%
 
Cool hat funktioniert :)
Registrierung der key.reg funktioniert, aber in der Registry erscheitn kein Schlüssel. Was mache ich falsch? Ausgeführt als Administrator und eine erfolgreiche meldung erscheint.

Habe eine zip Datei unten mal angehängt.

Noch etwas rumgebastelt und ich komme zu:
Code:
@echo off
del key.reg /F

set letterA=1
set letterB=2
set letterC=4
set letterD=8
set letterE=16
set letterF=32
set letterG=64
set letterH=128
set letterI=256
set letterJ=512
set letterK=1024
set letterL=2048
set letterM=4096
set letterN=8192
set letterO=16384
set letterP=32768
set letterQ=65536
set letterR=131072
set letterS=262144
set letterT=524288
set letterU=1048576
set letterV=2097152
set letterW=4194304
set letterX=8388608
set letterY=16777216
set letterZ=33554432

set wert=0

echo Eingabe mit # beenden

:eingabe
set /p var=zu sperrende Buchstaben (a-z, klein) eingeben:

rem Berechnung
if %var% == a (
  set /A wert=%wert%+%letterA%
) else (
  if %var% == b (
  set /A wert=%wert%+%letterB%
) else (
  if %var% == c (
  set /A wert=%wert%+%letterC%
) else (
  if %var% == d (
  set /A wert=%wert%+%letterD%
) else (
  if %var% == e (
  set /A wert=%wert%+%letterE%
) else (
  if %var% == f (
  set /A wert=%wert%+%letterF%
) else (
  if %var% == g (
  set /A wert=%wert%+%letterG%
) else (
  if %var% == h (
  set /A wert=%wert%+%letterH%
) else (
  if %var% == i (
  set /A wert=%wert%+%letterI%
) else (
  if %var% == j (
  set /A wert=%wert%+%letterJ%
) else (
  if %var% == k (
  set /A wert=%wert%+%letterK%
) else (
  if %var% == l (
  set /A wert=%wert%+%letterL%
) else (
  if %var% == m (
  set /A wert=%wert%+%letterM%
) else (
  if %var% == n (
  set /A wert=%wert%+%letterN%
) else (
  if %var% == o (
  set /A wert=%wert%+%letterO%
) else (
  if %var% == p (
  set /A wert=%wert%+%letterP%
) else (
  if %var% == q (
  set /A wert=%wert%+%letterQ%
) else (
  if %var% == r (
  set /A wert=%wert%+%letterR%
) else (
  if %var% == s (
  set /A wert=%wert%+%letterS%
) else (
  if %var% == t (
  set /A wert=%wert%+%letterT%
) else (
  if %var% == u (
  set /A wert=%wert%+%letterU%
) else (
  if %var% == v (
  set /A wert=%wert%+%letterV%
) else (
  if %var% == w (
  set /A wert=%wert%+%letterW%
) else (
  if %var% == x (
  set /A wert=%wert%+%letterX%
) else (
  if %var% == y (
  set /A wert=%wert%+%letterY%
) else (
  if %var% == z (
  set /A wert=%wert%+%letterZ%
) else (
  if %var% == # (
  goto ausgabe
) else (
  echo falscher Wert, bitte erneute Eingabe
  goto eingabe
)))))))))))))))))))))))))))

goto eingabe

:ausgabe
rem Wert in Hex umwandeln
hex2dec.exe %Wert%
FOR /f "tokens=2 delims== skip=5" %%f IN ('hex2dec.exe %Wert%') DO set hex=%%f
echo %hex% 

echo Ausgabe zur Kontrolle:
echo wert=%hex%

pause

echo Windows Registry Editor Version 5.00 >>key.reg
echo [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer] >>key.reg
echo "NoDrives"=dword:%hex% >>key.reg

key.reg
 

Anhänge

  • hide.zip
    155 KB · Aufrufe: 217
Nutz doch gleich auch die entsprechende Funktion zum Hinzufügen in die Registry. reg add <Dateiname> o.ä. Mehr unter reg /?.
 
Mit
Code:
reg add HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer /v NoDrives /t REG_DWORD /d %Wert%
funktioniert es, brauchst auch keinen Weg über eine reg-Datei.
 
:freak: Haut immernoch nicht hin. Selbst der Versuch als Admin das zu starten erzeugt keinen Eintrag in der Registry.

Um meine Batch zu testen kannst du in der aufforderung ein 'c' eingeben und als nächstes ein '#'. Dann zweimal enter. Danach den explorer.exe im Taskmanager abschießen und neustarten. Im Arbeitsplatz/Computer sollte nun das C-Laufwerk nicht mehr sichtbar sein :D
 
Zuletzt bearbeitet:
Hast du auch schon auf aktualisieren gedrückt in regedit nach der Ausführung, bzw. was meldet reg add?

PS: Du solltest dann eigentlich auch noch darauf achten, dass ein Buchstabe nicht mehrfach eingegeben wird.
 
Zuletzt bearbeitet:
Was ich damit meine ist: wenn du zweimal c eintippst, dann bist du bei 8 und D wird versteckt. Da könntest du dann stattdessen das Laufwerk C wieder anzeigen lassen bei erneuter Eingabe.
Und was sagt denn nun reg add? Das braucht natürlich Administratorrechte aber dann sollte es klappen. Und die Umrechnung in hex könntest du dir mit reg add auch sparen.
 
Auf die doppelte Eingabe des ein und des selben Buchstabes achte ich schon.
Ich habe etwas festgestellt. Ich hatte noch einen Syntaxfehler, der so beim ersten Blick garnicht ersichtlich wurde :freak:.

jetzt legt er den key an und fragt mich beim existierenden key, ob er das überschreiben soll

Mission complete :D

Jetzt kann ich auch ausschließlich die .bat File nutzen.
 
Zuletzt bearbeitet:
Du hast mich inspiriert, mal wieder ein bisschen C zu üben, wenn du möchtest, hast du hier das Resultat:
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define TRUE 1
#define FALSE 0
int temp, value, restorevalue;
char letter;
int state_A, state_B, state_C, state_D, state_E, state_F, state_G, state_H, state_I, state_J, state_K, state_L, state_M, state_N, state_O, state_P, state_Q, state_R, state_S, state_T, state_U, state_V, state_W, state_X, state_Y, state_Z;


int flip(int *state){
	char confirm;
	switch (*state){
		case TRUE : 
			printf("Drive %c is hidden. Unhide? (Y/N) ", letter);
			scanf("%c", &confirm); //wait
			scanf("%c", &confirm);
			if (toupper(confirm)=='Y'){
				value -= temp;
				*state = FALSE;
				};
			break;
		case FALSE: 
			printf("Drive %c is not hidden. Hide? (Y/N) ", letter);
			scanf("%c", &confirm); //wait
			scanf("%c", &confirm);
			if (toupper(confirm)=='Y'){
				value += temp;
				*state = TRUE;
				};
			break;
	};//end case
};


int main(){
char command[150], *temppath, confirm;
int exit;
FILE *tempfile;

exit=FALSE;
//Startwert mit reg query abfragen
//----------------------------------------------------------------------------------
system("echo off");
system("FOR /F \"tokens=2 skip=2 delims=x\" %i IN ('reg query HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer /v NoDrives') DO echo %i >%temp%\\nodrives");
system("cls");
temppath = malloc(100*sizeof(char));
temppath = getenv("temp");
strcat(temppath, "\\nodrives");
tempfile = fopen(temppath, "r");
fscanf(tempfile, "%x", &value);
fclose(tempfile);
remove(temppath);
free(temppath);
restorevalue = value;
//----------------------------------------------------------------------------------
if (value>=33554432){state_Z=TRUE; value-=33554432;}else{state_Z=FALSE;};
if (value>=16777216){state_Y=TRUE; value-=16777216;}else{state_Y=FALSE;};
if (value>=8388608)	{state_X=TRUE; value-=8388608;}	else{state_X=FALSE;};
if (value>=4194304)	{state_W=TRUE; value-=4194304;}	else{state_W=FALSE;};
if (value>=2097152)	{state_V=TRUE; value-=2097152;}	else{state_V=FALSE;};
if (value>=1048576)	{state_U=TRUE; value-=1048576;}	else{state_U=FALSE;};
if (value>=524288)	{state_T=TRUE; value-=524288;}	else{state_T=FALSE;};
if (value>=262144)	{state_S=TRUE; value-=262144;}	else{state_S=FALSE;};
if (value>=131072)	{state_R=TRUE; value-=131072;}	else{state_R=FALSE;};
if (value>=65536)	{state_Q=TRUE; value-=65536;}	else{state_Q=FALSE;};
if (value>=32768)	{state_P=TRUE; value-=32768;}	else{state_P=FALSE;};
if (value>=16384)	{state_O=TRUE; value-=16384;}	else{state_O=FALSE;};
if (value>=8192)	{state_N=TRUE; value-=8192;}	else{state_N=FALSE;};
if (value>=4096)	{state_M=TRUE; value-=4096;}	else{state_M=FALSE;};
if (value>=2048)	{state_L=TRUE; value-=2048;}	else{state_L=FALSE;};
if (value>=1024)	{state_K=TRUE; value-=1024;}	else{state_K=FALSE;};
if (value>=512)		{state_J=TRUE; value-=512;}		else{state_J=FALSE;};
if (value>=256)		{state_I=TRUE; value-=256;}		else{state_I=FALSE;};
if (value>=128)		{state_H=TRUE; value-=128;}		else{state_H=FALSE;};
if (value>=64)		{state_G=TRUE; value-=64;}		else{state_G=FALSE;};
if (value>=32)		{state_F=TRUE; value-=32;}		else{state_F=FALSE;};
if (value>=16)		{state_E=TRUE; value-=16;}		else{state_E=FALSE;};
if (value>=8)		{state_D=TRUE; value-=8;}		else{state_D=FALSE;};
if (value>=4)		{state_C=TRUE; value-=4;}		else{state_C=FALSE;};
if (value>=2)		{state_B=TRUE; value-=2;}		else{state_B=FALSE;};
if (value>=1)		{state_A=TRUE; value-=1;}		else{state_A=FALSE;};
value = restorevalue;
//----------------------------------------------------------------------------------
printf("NoDrives Tweaker for Win NT\nPress Enter to continue");
do{	
	getchar(); //Wait for enter
	printf("\nEnter Drive Letter to Hide/Unhide (# to exit): ");
	scanf("%c", &letter);
	letter = toupper(letter);
	
	temp=0;
	switch (letter){
		case '#' : exit=TRUE; break;
		case 'A' : temp = 1; 		flip(&state_A); break;
		case 'B' : temp = 2; 		flip(&state_B); break;
		case 'C' : temp = 4; 		flip(&state_C); break;
		case 'D' : temp = 8; 		flip(&state_D); break;
		case 'E' : temp = 16; 		flip(&state_E); break;
		case 'F' : temp = 32; 		flip(&state_F); break;
		case 'G' : temp = 64; 		flip(&state_G); break;
		case 'H' : temp = 128; 		flip(&state_H); break;
		case 'I' : temp = 256; 		flip(&state_I); break;
		case 'J' : temp = 512; 		flip(&state_J); break;
		case 'K' : temp = 1024; 	flip(&state_K); break;
		case 'L' : temp = 2048; 	flip(&state_L); break;
		case 'M' : temp = 4096; 	flip(&state_M); break;
		case 'N' : temp = 8192; 	flip(&state_N); break;
		case 'O' : temp = 16384; 	flip(&state_O); break;
		case 'P' : temp = 32768; 	flip(&state_P); break;
		case 'Q' : temp = 65536; 	flip(&state_Q); break;
		case 'R' : temp = 131072; 	flip(&state_R); break;
		case 'S' : temp = 262144; 	flip(&state_S); break;
		case 'T' : temp = 524288; 	flip(&state_T); break;
		case 'U' : temp = 1048576; 	flip(&state_U); break;
		case 'V' : temp = 2097152; 	flip(&state_V); break;
		case 'W' : temp = 4194304; 	flip(&state_W); break;
		case 'X' : temp = 8388608; 	flip(&state_X); break;
		case 'Y' : temp = 16777216; flip(&state_Y); break;
		case 'Z' : temp = 33554432; flip(&state_Z); break;
		default : printf("\nEingabe ungueltig, Press Enter to continue");
	}//end case
}while (!exit);
//------------------------------------------------------------------------
printf("Save changes? (Y/N)");
scanf("%c", &confirm); //wait
scanf("%c", &confirm);
		if (toupper(confirm)=='Y'){
			sprintf(command, "reg add HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer /v NoDrives /t REG_DWORD /d %d", value);
			system(command);
		}else{
		printf("Eingabe verworfen\n");
		};
system("pause");
}

Auch wenn du's mittlerweile wahrscheinlich schon in C# hast, ich hab's auch mal noch in optischer Form zum Anklicken (soll keiner sagen, man könne mit Delphi gar nix machen)
 

Anhänge

  • nodrives.zip
    2 KB · Aufrufe: 220
  • NoDrives2.zip
    300,9 KB · Aufrufe: 224
Zuletzt bearbeitet: (NoDrives2 hinzugefügt)
Pff, wer programmiert heutzutage denn noch in C :D. Batchcoding ist doch viel cooler :evillol:

Vielleicht inspirierst du mich dazu wieder in c# anzufangen. Meine Kenntnisse waren zwar nicht hervorragend, aber Übung macht ja bekanntlich den Meister ;)
Das ganze in optischen Forms zum anklicken, welche LW's ausgeblendet werden sollen.
 
Zurück
Oben