[CMD] Key uit register vissen met space

Pagina: 1
Acties:

  • Brent
  • Registratie: September 2001
  • Laatst online: 10:56
Ik heb een .bat in elkaar geflanst/gejat dat een bepaalde operatie uitvoert. Het haalt uit een opgegeven sleutel in het register een waarde (in mijn geval steeds een installatiedirectory van een programma) en kopieert met deze informatie bestanden naar deze lokatie, danwel in een submap. Ik zal eerst het scriptje maar eens geven :) :
code:
1
2
3
4
5
6
7
setlocal
set Key=HKEY_LOCAL_MACHINE\SOFTWARE\blablabla\bla
set Value1=sleutelmetinstallatiemap

for /f "skip=4 tokens=2*" %%a in ('reg query "%Key%" /v "%Value1%"') do set %Value1%=%%b

copy "bestand.dat" "%sleutelmetinstallatiemap%\submap" /y

Nu is het probleem dat zodra ik spaties in de Key of Value1 ga invoeren (ik kan niet bepalen welke nu het probleem geeft) er rare dingen gaan gebeuren. Een bepaald programma dat ik zo wil updaten heeft spaties in de Key en Value1 waardes. Nu krijg ik als uitvoer bij de laatste regel %sleutelmetinstallatiemap% het volgende: "REG_SZ C:\locatie\van\programma\submap". Niet zo handig dus. Het klopt inderdaad dat de info in een dingetje van het type REG_SZ staat. Weet iemand misschien wat hier fout gaat en hoe het goed zal gaan? Informatie op het web aangaande dit onderwerp is zeer schaars (ben al blij dat ik uberhaupt 1 script kon vinden) en zelf weet ik er niet genoeg vanaf.

Als secundair probleem is er ook nog een programma wat zijn installatie map als REG_BINARY opslaat. Hoewel regedit.exe simpel de zaak in normale letters (en uiteraard binair) laat zien, werkt het geheel niet als ik gewoon doe alsof het een REG_SZ is (die werken wel, als er geen spaties in zitten tenminste :)).

Humanist | Kernpower! | Determinist | Verken uw geest | Politiek dakloos


  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

set Key="HKEY_LOCAL_MACHINE\SOFTWARE\blablabla\bla spatie bla" :?

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


  • Brent
  • Registratie: September 2001
  • Laatst online: 10:56
Dat had ik ook al geprobeerd. dat werkt ook niet, had ik even moeten zeggen :) Die haakjes worden dan meegenomen in de string en dan gaat het alsnog fout :)

[edit1]
Ah, oplossing gevonden! Als ik dit regeltje:
code:
1
FOR %%V IN (%Install Dir%) DO SET Install Dir=%%~V

voor het copycommand zet, gaat het goed.

Dan zoek ik nu nog een manier om een binaire waarde om te zetten in een normale waarde.

[edit2]
Hmm, dit werkt alleen als de waarde met de installatie map geen spaties bevat, en de meeste programma's zitten in een map met spaties.. (Program Files). What to do...

[ Voor 98% gewijzigd door Brent op 19-12-2003 10:51 ]

Humanist | Kernpower! | Determinist | Verken uw geest | Politiek dakloos


  • Brent
  • Registratie: September 2001
  • Laatst online: 10:56
Ik snap nu wat dat laatste regeltje ongeveer doet. "%%V" kijkt hoeveel spaties er zijn en "=%%~V" knipt de string bij elke spatie in stukken. Ik wil dat alles voor de eerste spatie erafgeknipt wordt (want daar staat om de 1 of andere reden "REG_SZ "). Weet iemand hoe dat moet?

Humanist | Kernpower! | Determinist | Verken uw geest | Politiek dakloos


  • Brent
  • Registratie: September 2001
  • Laatst online: 10:56
And up she goes :)

Humanist | Kernpower! | Determinist | Verken uw geest | Politiek dakloos


  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Volgens mij is het als volgt; de %%V is gewoon de batch manier om de environment variabele 'V' aan te spreken. De for split standaard op spatie; wat hij dus doet is dat hij voor elk element een keer het commando uitvoerd.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>set Install Dir=a b c

>set Install Dir
Install Dir=a b c

>FOR %V IN (%Install Dir%) DO SET Install Dir=%~V

SET Install Dir=a

SET Install Dir=b

SET Install Dir=c

>set Install Dir
Install Dir=c
wat je kunt doen is een IF inbouwen om de 1e waarde te skippen:
code:
1
FOR %V IN (%Install Dir%) DO IF NOT %V==REG_SZ) SET Install Dir=%~V
zoiets?
Anders moet je even laten horen wat je exacte waarde van install dir is; en wat de gewenste waarde is :)

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


  • Brent
  • Registratie: September 2001
  • Laatst online: 10:56
Key=HKEY_LOCAL_MACHINE\SOFTWARE\LucasArts Entertainment Company LLC\Star Wars Galactic Battlegrounds: Clone Campaigns\1.0
Value1=Game Path

en Game Path heeft als waarde C:\Program Files\Games\Star Wars Galactic Battlegrounds\Game\

Normaal gesproken geeft Game Path in het script aan het eind "REG_SZ C:\Program Files\Games\Star Wars Galactic Battlegrounds\Game\". Dat REG_SZ moet er dus af. Dat laatste regeltje van jouw werkt helaas ook niet, hij zegt dan

Het volgende gebruik van de padoperator bij het vervangenvan batchparameters is ongeldig: %~V

(het scriptje heeft de bedoeling de installatie van bepaalde files te vergemakkelijken :))

[ Voor 34% gewijzigd door Brent op 20-12-2003 18:42 ]

Humanist | Kernpower! | Determinist | Verken uw geest | Politiek dakloos


  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Breepee schreef op 20 december 2003 @ 18:38:
Key=HKEY_LOCAL_MACHINE\SOFTWARE\LucasArts Entertainment Company LLC\Star Wars Galactic Battlegrounds: Clone Campaigns\1.0
Value1=Game Path

en Game Path heeft als waarde C:\Program Files\Games\Star Wars Galactic Battlegrounds\Game\

Normaal gesproken geeft Game Path in het script aan het eind "REG_SZ C:\Program Files\Games\Star Wars Galactic Battlegrounds\Game\". Dat REG_SZ moet er dus af. Dat laatste regeltje van jouw werkt helaas ook niet, hij zegt dan

Het volgende gebruik van de padoperator bij het vervangenvan batchparameters is ongeldig: %~V

(het scriptje heeft de bedoeling de installatie van bepaalde files te vergemakkelijken :))
om hem in een batch file te kunnen gebruiken moet je van de enkele %tekens, dubbele %tekens maken :) ik zal even kijken of het werkt zoals je wilt

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


  • Brent
  • Registratie: September 2001
  • Laatst online: 10:56
Graag, als ik ernu dubbele %-tekens van maak, hou ik alleen de laatste term (na de laatste spatie) over, dus Battlegrounds\Game\. Je ziet wel, dat ik er nog niet erg veel kaas van heb gegeten :)

Humanist | Kernpower! | Determinist | Verken uw geest | Politiek dakloos


  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

ik krijg reg.exe niet te pakken :(
Kun je anders voor die for even een echo van %Install Dir% doen? Of is dat die "REG_SZ C:\Program Files\Games\Star Wars Galactic Battlegrounds\Game\" En daar wil je de 1e REG_SZ vanaf halen?

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


Verwijderd

wat je kunt doen is een IF inbouwen om de 1e waarde te skippen:
code:
1
FOR %V IN (%Install Dir%) DO IF NOT %V==REG_SZ) SET Install Dir=%~V
zoiets?
Anders moet je even laten horen wat je exacte waarde van install dir is; en wat de gewenste waarde is :)
code:
1
FOR %V IN (%Install Dir%) DO IF NOT %V==REG_SZ) SET Install Dir= %Install Dir% %~V


simpelweg append


voor DOS:
set params=
for %%x in ( 1 2 3 4 5 6) do if exist MSCD000%%x set params=%params% /D:%%x
mscdex %params% /L:X

dit bouwt een reeks op:
/D:mscd0001
/D:mscd0001 /D:mscd0002
/D:mscd0001 /D:mscd0002 /D:mscd0003
etc

en zorgt hierna dat de cdromdriver deze blockdevices allemaal laadt.

gedoe met lange bestandsnamen..
code:
1
FOR %%x IN (%InstallDir%) DO IF NOT "%%x"=="REG_SZ"  SET InstallDir=%InstallDir% %%x

[ Voor 11% gewijzigd door Verwijderd op 20-12-2003 19:41 ]


  • Brent
  • Registratie: September 2001
  • Laatst online: 10:56
Dit script:
code:
1
2
3
4
5
6
7
8
setlocal
set Key=HKEY_LOCAL_MACHINE\SOFTWARE\LucasArts Entertainment Company LLC\Star Wars Galactic Battlegrounds: Clone Campaigns\1.0
set Value1=Game Path

for /f "skip=4 tokens=2*" %%a in ('reg query "%Key%" /v "%Value1%"') do set %Value1%=%%b
FOR %%V IN (%Game Path%) DO IF NOT %%V==REG_SZ) SET Game Path=%%~V

echo %Game Path%

geeft dit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Q:\test>setlocal

Q:\test>set Key=HKEY_LOCAL_MACHINE\SOFTWARE\LucasArts Ent
ertainment Company LLC\Star Wars Galactic Battlegrounds: Clone Campaigns\1.0

Q:\test>set Value1=Game Path

Q:\test>for /F "skip=4 tokens=2*" %a in ('reg query "HKEY
_LOCAL_MACHINE\SOFTWARE\LucasArts Entertainment Company LLC\Star Wars Galactic B
attlegrounds: Clone Campaigns\1.0" /v "Game Path"') do set Game Path=%b

Q:\test>set Game Path=REG_SZ     C:\Program Files\Games\S
tar Wars Galactic Battlegrounds\Game\

Q:\test>FOR %V IN (REG_SZ C:\Program Files\Games\Star War
s Galactic Battlegrounds\Game\) DO IF NOT %V == REG_SZ) SET Game Path=%~V

Q:\test>IF NOT REG_SZ == REG_SZ) SET Game Path=REG_SZ

Q:\test>IF NOT C:\Program == REG_SZ) SET Game Path=C:\Pro
gram

Q:\test>IF NOT Files\Games\Star == REG_SZ) SET Game Path=
Files\Games\Star

Q:\test>IF NOT Wars == REG_SZ) SET Game Path=Wars

Q:\test>IF NOT Galactic == REG_SZ) SET Game Path=Galactic


Q:\test>IF NOT Battlegrounds\Game\ == REG_SZ) SET Game Pa
th=Battlegrounds\Game\

Q:\test>echo Battlegrounds\Game\
Battlegrounds\Game\

En
code:
1
2
3
4
5
6
7
8
setlocal
set Key=HKEY_LOCAL_MACHINE\SOFTWARE\LucasArts Entertainment Company LLC\Star Wars Galactic Battlegrounds: Clone Campaigns\1.0
set Value1=Game Path

for /f "skip=4 tokens=2*" %%a in ('reg query "%Key%" /v "%Value1%"') do set %Value1%=%%b
FOR %%x IN (%Game Path%) DO IF NOT "%%x"=="REG_SZ"  SET Game Path=%Game Path% %%x

echo %Game Path%
geeft
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
Q:\test>setlocal

Q:\test>set Key=HKEY_LOCAL_MACHINE\SOFTWARE\LucasArts Ent
ertainment Company LLC\Star Wars Galactic Battlegrounds: Clone Campaigns\1.0

Q:\test>set Value1=Game Path

Q:\test>for /F "skip=4 tokens=2*" %a in ('reg query "HKEY
_LOCAL_MACHINE\SOFTWARE\LucasArts Entertainment Company LLC\Star Wars Galactic B
attlegrounds: Clone Campaigns\1.0" /v "Game Path"') do set Game Path=%b

Q:\test>set Game Path=REG_SZ     C:\Program Files\Games\S
tar Wars Galactic Battlegrounds\Game\

Q:\test>FOR %x IN (REG_SZ C:\Program Files\Games\Star War
s Galactic Battlegrounds\Game\) DO IF NOT "%x" == "REG_SZ" SET Game Path=REG_SZ
C:\Program Files\Games\Star Wars Galactic Battlegrounds\Game\ %x

Q:\test>IF NOT "REG_SZ" == "REG_SZ" SET Game Path=REG_SZ
C:\Program Files\Games\Star Wars Galactic Battlegrounds\Game\ REG_SZ

Q:\test>IF NOT "C:\Program" == "REG_SZ" SET Game Path=REG
_SZ     C:\Program Files\Games\Star Wars Galactic Battlegrounds\Game\ C:\Program


Q:\test>IF NOT "Files\Games\Star" == "REG_SZ" SET Game Pa
th=REG_SZ       C:\Program Files\Games\Star Wars Galactic Battlegrounds\Game\ Fi
les\Games\Star

Q:\test>IF NOT "Wars" == "REG_SZ" SET Game Path=REG_SZ
C:\Program Files\Games\Star Wars Galactic Battlegrounds\Game\ Wars

Q:\test>IF NOT "Galactic" == "REG_SZ" SET Game Path=REG_S
Z       C:\Program Files\Games\Star Wars Galactic Battlegrounds\Game\ Galactic

Q:\test>IF NOT "Battlegrounds\Game\" == "REG_SZ" SET Game
 Path=REG_SZ    C:\Program Files\Games\Star Wars Galactic Battlegrounds\Game\ Ba
ttlegrounds\Game\

Q:\test>echo REG_SZ      C:\Program Files\Games\Star Wars
 Galactic Battlegrounds\Game\ Battlegrounds\Game\
REG_SZ  C:\Program Files\Games\Star Wars Galactic Battlegrounds\Game\ Battlegrou
nds\Game\

Sorry voor de lay-out vernueking :P

Humanist | Kernpower! | Determinist | Verken uw geest | Politiek dakloos


  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Probeer dit eens:

code:
1
2
3
4
5
6
7
8
setlocal
set Key=HKEY_LOCAL_MACHINE\SOFTWARE\LucasArts Entertainment Company LLC\Star Wars Galactic Battlegrounds: Clone Campaigns\1.0
set Value1=Game Path

for /f "skip=4 tokens=2*" %%a in ('reg query "%Key%" /v "%Value1%"') do set %Value1%=%%b
FOR %%x IN (%Game Path%) DO IF NOT "%%x"=="REG_SZ "  SET Game Path=%Game Path% %%x

echo %Game Path%
:? En verder moet het zelf zo toch ook wel lukken :?

[ Voor 10% gewijzigd door Spider.007 op 20-12-2003 20:11 ]

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


  • Brent
  • Registratie: September 2001
  • Laatst online: 10:56
dat geeft dit:
code:
1
2
3
4
Q:\test>echo REG_SZ      C:\Program Files\Games\Star Wars
 Galactic Battlegrounds\Game\ Battlegrounds\Game\
REG_SZ  C:\Program Files\Games\Star Wars Galactic Battlegrounds\Game\ Battlegrou
nds\Game\

Humanist | Kernpower! | Determinist | Verken uw geest | Politiek dakloos

Pagina: 1