Newsgroup: it.comp.lang.visual-basic
Titolo: Aggiungere carattere in stringa registro

Salve.
Ho bisogno di un aiuto.
 
Ho una chiave di registro a cui ho necessita' di aggiungere un carattere 
(uno qualsiasi), e poi di riportarla com'era.
Il tutto deve essere eseguito (o richiamabile) da file batch.
 
Esempio: la chiave contiene "computer"
 
Il batch esegue alcune operazioni (copie di file, cancellazioni, etc), poi 
dovrebbe leggere una certa chiave di registro, che in questo caso contiene 
"computer", la cambia (per esempio in computer-) e continua.
Proseguendo nel batch, poi dovrebbe rimetere la chiave a posto, in questo 
caso togliendo "-" alla chiave.
 
Per esempio, il file bat contiene:
 
cd\windows
del file.exe
copy nomefile.exe c:\
script.vbs <<< cambia una chiave aggiungendo "-"
copy altronome.exe c:\
script2.vbs <<< rimette a posto la chiave togliendo "-"
 
E' possibile fare cio' con uno script in VBS?
 
La chiave e'
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerName
 
E' ovvio che il tutto verra' eseguito con i privilegi adeguati.
E' altrettanto ovvio che la chiave cambia da PC a PC, altrimenti non mi 
servirebbe alcun tipo di programmazione :)
 
Magari e' pure fattibile direttamente in batch, ma non ho idea di come.
Un aiuto, magari in VBS?
 
GRAZIE! 
 
 

 ha
scritto:

In VBS si può facilmente usare il registy
 
Un esempio che mi e servito:sono salvato e che mi è servito:
___________________________________
 
Set wShell = CreateObject( "WScript.Shell" )
'
' Create a new DWORD value:
wshShell.RegWrite "HKCU\TestKey\DWordTestValue", 1, "REG_DWORD"
 
' Create a new subkey and a string value in that new subkey:
wshShell.RegWrite "HKCU\TestKey\SubKey\StringTestValue", "Test", "REG_SZ"
 
' Read the values we just created:
WScript.Echo "HKCU\TestKey\DWordTestValue = " _
           & wshShell.RegRead( "HKCU\TestKey\DWordTestValue" )
WScript.Echo "HKCU\TestKey\SubKey\StringTestValue = """ _
           & wshShell.RegRead( "HKCU\TestKey\SubKey\StringTestValue" ) & """"
 
' Delete the subkey and key and the values they contain:
wshShell.RegDelete "HKCU\TestKey\SubKey\"
wshShell.RegDelete "HKCU\TestKey\"
 
 
' Note: Since the WSH Shell has no Enumeration functionality, you cannot
'       use the WSH Shell object to delete an entire "tree" unless you
'       know the exact name of every subkey.
'       If you don't, use the WMI StdRegProv instead.
 
' Release the object
Set wshShell = Nothing
___________________________
 
Per adattarlo alle tue esigenze naturalmente devi sostituire la stringa con il
valore del registro.
 
 
 
-- 
ciao
  Stefano

 In VBS si può facilmente usare il registy
 
Maa... non fa quello che ho chiesto.
Io devo aggiungere un carattere ad una chiave, non la chiave in se'.
 
Oppure non ho capito io quello che hai postato...
 
 

Oppure non ho capito io quello che hai postato...
 
 
Non c'è molto da capire, per cambiare una chiave in un registro devi scriverne
di nuovo il valore.
Il metodo .RegWrite serve proprio a quello.
 
https://ss64.com/vb/regwrite.html
 
 
Lo script che ti ho messo era un esempio con tutti i metodi di "WScript.Shell"
per il registry che sono:
 
   .RegRead          'Leggi registro 
   .RegDelete        'Cancella registro
   .RegWrite          'Scrivi registro
 
 
-- 
ciao
  Stefano

 di nuovo il valore.
 
Teoricamente non mi serve nemmeno scrivere nulla, ma solo esportare la 
chiave in un file di testo (so farlo), modificare il file di testo con uno 
script (non so farlo) e reimprtare la chiave (so farlo).
 
Il busillis e': qualcuno puo' gentilmente buttare giu' due righe di script 
per variare questa benedetta scritta in un file di testo?
 
Il file di testo contiene la seguente roba:
 
+++++++
Windows Registry Editor Version 5.00
 
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerName]
"ComputerName"="esempio"
+++++++
 
Come si vede, tutto cio' che e' compreso tra gli ultimi due segni "=" deve 
essere seguito prima da un "-", e poi (con un secondo script) il "-" deve 
essere tolto.
 
Il file di testo diventa quindi:
 
 
+++++++
Windows Registry Editor Version 5.00
 
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerName]
"ComputerName"="esempio-"
+++++++
 
...per poi tornare com'era.
 
 
 

> Non c'?olto da capire, per cambiare una chiave in un registro devi 

Qualcosa del genere, da me funziona, nel senso che cambia il valore della chiave
e poi la rimette a posto.
Ho messo i commenti cosě č piů chiaro cosa fa.
 
RegKey.vbs
________________________
 
 
Set wshShell = CreateObject( "WScript.Shell" )
 
 
Reg_Key =
"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerName\ComputerName"
 
'legge il valore
RegValue = wshShell.RegRead(Reg_Key)'& """"
WScript.Echo RegValue
 
'aggiunge  "-"
RegValueNew = RegValue & "-"
 
'mette il valore nuovo
wshShell.RegWrite (Reg_Key), RegValueNew, "REG_SZ"
 
'legge il valore nuovo
WScript.Echo wshShell.RegRead(Reg_Key)
 
'rimette il vecchio valore
wshShell.RegWrite (Reg_Key), RegValue, "REG_SZ"
 
'legge il valore vecchio
WScript.Echo wshShell.RegRead(Reg_Key)
 
Wscript.Quit
_________________________
 
 
 
-- 
ciao
  Stefano

 WScript.Echo wshShell.RegRead(Reg_Key)
 
Qui dovremmo leggerlo dal file.txt
 
Oppure, visto che sappiamo GIA' che c'e' un "-" in piu', dovremmo toglierlo.
Quindi si rilegge la chiave con RegRead, che sara' "nomecomputer-", e gli si 
toglie l'ultimo carattere (non ho idea di come!).
 
Grazie ancora per la pazienza. 
 
 

toglie l'ultimo carattere (non ho idea di come!).
 
Se il contenuto cambia solo per l'ultimo carattere puoi fare:
 
Regvalue = Mid (Regvalue, 1, Len(Regvalue) - 1)
 
 
 
-- 
ciao
  Stefano

 Regvalue = Mid (Regvalue, 1, Len(Regvalue) - 1)
 
Chiaro, ma tutto cio' se non "esco" dal VBS!
Quindi provero con wshShell.Run (Cmnd ,1 ,True)
 
Ti tengo informato e grazie.
 
 

 wshShell.Run (Cmnd ,1 ,True)
 
Mi restituisce "Impossibile utilizzare parentesi per la chiamata di routine 
Sub"
 
Se uso:
 
Set objShell = WScript.CreateObject("WScript.Shell")
objShell.Run ("C:\Program Files (x86)\nome\nome64.exe" & 
WScript.ScriptFullName)
 
Mi da' "Impossibile trovare il file specificato".
 
Idee?
 
 

Si, mi necessita cosi', esattamente come il "call" del batch.
 
A volte, se windows non rispetta esattamente i sincronismi, ad esempio in caso
di scrittura di files, puoi aver necessità di aggiungere un ritardo utile a
sincronizzare gli eventi, in quel caso basta scrivere in una linea:
 
Wscript.Sleep 100
 
dove il numero esprime i millisecondi di attesa, e l'esecuzione si ferma per il
tempo indicato.
 
 
-- 
ciao
  Stefano

 ha scritto nel messaggio
news:5nkh8e5lnld7lldrl...@4ax.com...
 




Se hai degli spazi all'interno della stringa di comando, .Run va in errore, devi
mettere le " anche all'esterno.
 
In particolare se hai questa stringa:
 
Cmnd = "C:\Program Files (x86)\nome\nome64.exe"
 
deve diventare così:
 
Cmnd = Chr(34) & "C:\Program Files (x86)\nome\nome64.exe" & Chr(34)
 
 
-- 
ciao
  Stefano

 deve diventare così:
 
Risolto. Accidenti, grazie... :)
 
Ok, mi hai risolto un grande problema, ma me ne hai "creato" un altro :) :)
Nel senso che adesso funziona tutto *dentro* il VBS e non ho piu' bisogno di 
usare il batch, ma il batch mi cancellava alcuni files e directory.
 
Ho cercato di farlo anche in VBS ma e' il solito "delirio"... devi definire 
l'oggetto, etc.
Ho paura di fare casino senza volerlo, stavolta.
 
Io devo cancellare due files in programdata/nome e poi rimuovere la dir 
programdata\nome\altronome
 
In batch:
 
del C:\ProgramData\nome\nomefile.txt
del C:\ProgramData\nome\nomefile2.txt
del C:\ProgramData\nome\altronome\*.* /q
rd C:\ProgramData\nome\altronome
 
Tutto questo PRIMA del cambio della chiave di registro.
 
Tanta semplicita' anni 80 diventa per me un ostacolo in VBS... :(
 
 

Tanta semplicita' anni 80 diventa per me un ostacolo in VBS... :(
 
Puoi seguire due strade:
usi il Fso
 
FileName = "C:\ProgramData\nome\nomefile.txt"
 
  Set Fso = CreateObject("Scripting.FileSystemObject")
 
  If Fso.FileExists(FileName) Then Fso.DeleteFile FileName, True	
 
oppure, se ti trovi meglio con il dos, puoi invocare un comando direttamente da
Shell:
 
 
CommandLine = "Del  C:\ProgramData\nome\nomefile.txt"
oShell.Run "
command.com
 /k " & CommandLine
 
 
 
-- 
ciao
  Stefano

 usi il Fso
 
Si, stavo giusto scrivendo che "c'ero riuscito" (leggi: ho copiato bene!)
 
Set obj = CreateObject("Scripting.FileSystemObject")
obj.DeleteFile("C:\1\prova.txt")
obj.DeleteFile("C:\1\prova1.txt")
obj.DeleteFile("C:\3\*.*")
obj.DeleteFolder("C:\3")
 
Grazie ancora per avermi aiutato...
Sono conscio che in VBS si fanno cose "miracolose" e dovrei approfondirlo 
ma... io mi fermo qui :)
Ciao. 
 
 

 obj.DeleteFile("C:\3\*.*")
 
Si vabbe', ho sognato per 10 minuti. Scusami.
Non c'e' "*.*" in VBS :)
 
Hai anche ragione che avrei dovuto prima chiedere se il file esiste.
 
Ho quindi aggiunto "If then" e ora funziona anche se i file non sono 
presenti.
 
Rimane il fatto di dover rimuovere una directory che contiene vari file 
(estensione variabile).
Posso anche evitare di rimuovere la directory, ma i file devo toglierli.
 
Non posso definire a priori il file perche' sono files temporanei e sia il 
nome che l'estensione sono variabili.
 
 

Non c'e' "*.*" in VBS :)
 
Chi l'ha detto, DeleteFile può contenere wildcards * o ?
 
https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/deletefile-method
 
 
 
Poi alla fine fai DeleteFolder
 
 
-- 
ciao
  Stefano

 Poi alla fine fai DeleteFolder
 
Anche qui, if exists then?
O si incazza se non trova il nome del folder?
 
Io lo metto... :)
 
 
 
 

Io lo metto... :)
 
E' sempre meglio evitare errori
 
-- 
ciao
  Stefano

 E' sempre meglio evitare errori
 
Fatto, come mi hai spiegato e con if exist
Funge.
 
Non mi funge, invece (ecco perche' prima stavo gettando la spugna), se uso 
le variabili di ambiente.
 
Esempio:
 
File1 = "C:\%ProgramData%\nome\nomefile.txt"
Set Fso = CreateObject("Scripting.FileSystemObject")
If Fso.FileExists(File1) Then Fso.DeleteFile File1, True
 
...non funziona.
Se tolgo i "%" funziona.
 
Lo stesso per "program files".
 
 
 

Lo stesso per "program files".
Probabilmente sbagliata anche lei.
 
Bisogna vedere quali variabili ci sono, da un Prompt dei comandi digita SET +
Enter e vedrai l'elenco delle variabili di ambiente.
 
Comunque in VBS lo Shell gestisce le variabili d'ambiente, es
 
destF = oShell.expandenvironmentstrings("%systemroot%") &
"\system32\AUTOEXEC.NT"
 
 
https://ss64.com/vb/env.html
 
 
https://blogs.msdn.microsoft.com/rahulso/2006/12/29/how-to-read-user-and-system-variables-using-vbscript/
 
 
-- 
ciao
  Stefano

 Questa è sbagliata perchè %ProgramData% contiene già il "C:\"
 
Hai STRAragione!
E' quello.
 
Se avessi voluto scrivere il risultato della somma della chiave + "-" su un 
file, come avrei dovuto fare?
Intendo: al posto di RegWrite..
 
 

 E' quello.
 
No, non e' quello.
Sbagliero' qualcos'altro.
 
Ecco il SET cosa mi risponde.
 
ProgramData=C:\ProgramData
ProgramFiles=C:\Program Files
ProgramFiles(x86)=C:\Program Files (x86)
ProgramW6432=C:\Program Files
PROMPT=$P$G
PSModulePath=C:\Program Files\WindowsPowerSh
PUBLIC=C:\Users\Public
SESSIONNAME=Console
SystemDrive=C:
SystemRoot=C:\Windows
 
Se sostituisco C:\programdata\ con %PROGRAMDATA% non sortisce alcun effetto.
 
File = "%PROGRAMDATA%\nome\nomefile.txt"
Folder = "%PROGRAMDATA%\nome\cartella"
 
Set Fso = CreateObject("Scripting.FileSystemObject")
 
If Fso.FileExists(File1) Then Fso.DeleteFile File1, True
 
Fso.DeleteFile("Folder\*.*"), True
 
If Fso.FolderExists(Folder) Then Fso.DeleteFolder(Folder), True
 
Idee per un debug?
 
 
 



A volte il parametro viene espanso durante la chiamata, a volte no.
Per esserne sicuro devi usare il metodo ExpandEnvironmentStrings della Shell.
 
Per usarlo nelle tue variabili devi fare:
 
  Set oShell = CreateObject("Wscript.Shell")
 
PROGRAM_DATA = oShell.ExpandEnvironmentStrings ("%PROGRAMDATA%")
 
File = PROGRAM_DATA & "\nome\nomefile.txt"
 
Folder = PROGRAM_DATA & "\nome\cartella"
 
 
-- 
ciao
  Stefano

Intendo: al posto di RegWrite..
 
Const ForAppending = 8, ForReading = 1, ForWriting = 2
 
  Set Fso = CreateObject("Scripting.FileSystemObject")
  Set oShell = CreateObject("Wscript.Shell")
 
Reg_Key =
"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerName\ComputerName"
 
'legge il valore
RegValue = wshShell.RegRead(Reg_Key)'& """"
 
'aggiunge  "-"
RegValueNew = RegValue & "-"
 
 
'lo scrive in un file
File = "C:\ProgramData\nome\nomefile.txt"
 
 Set File_W = FSO.OpenTextFile (File, ForWriting, True)
     File_W.WriteLine (RegValueNew )
 File_W.Close
 
 
-- 
ciao
  Stefano

 Per usarlo nelle tue variabili devi fare:
 
Funziona. Grazie.
Ci sono troppe cose da sapere che vengono fuori solo con l'esperienza, e la 
cosa che mi meraviglia e' che ci sono svariati modi di fare la stessa cosa, 
tutti documentati.
Intendo dire: non sono modi diversi di agire (tipici della programmazione) 
ma proprio diversi modi "fatti" per fare una cosa comune come quella di 
cancellare un file.
 
 
Ecco come ho fatto:
 
Set wshShell = CreateObject( "WScript.Shell" )
 
PROGRAM_DATA = wshShell.ExpandEnvironmentStrings ("%PROGRAMDATA%")
 
'definisce nomefile e folder
Folder = PROGRAM_DATA & "\nome"
File1 = Folder & "\nomefile.txt"
File2 = Folder & "\altronomefile.txt"
 
Set Fso = CreateObject("Scripting.FileSystemObject")
 
'cancella file1 e file2
If Fso.FileExists(File1) Then Fso.DeleteFile File1, True
If Fso.FileExists(File2) Then Fso.DeleteFile File2, True
 
'svuota folder
Fso.DeleteFile(Folder & "\secondo_folder\*.*"), True
 
'cancella fodler
If Fso.FolderExists(Folder & "\secondo_folder") Then Fso.DeleteFolder(Folder 
& "\secondo_folder"), True
 
Domani mi cimento nella scrittura del file.
Grazie ancora. 
 
 

 Ecco come ho fatto:
 
Il lancio del programma con la variabile di ambiente pero' non funziona.
 
Set wshShell = CreateObject( "WScript.Shell" )
 
'definisce variabile di ambiente
PROGRAM_DATA = wshShell.ExpandEnvironmentStrings ("%PROGRAMDATA%")
PROGRAMMI = wshShell.ExpandEnvironmentStrings ("%ProgramFiles(x86)%")
 
'lancia SW
wshShell.run "cmd /c "PROGRAMMI & "\nome\nome.exe""",0,True
 
C'entrano SICURO le parentesi di ("%ProgramFiles(x86)%"), mi pare che me ne 
avessi parlato...
 
 



C'entrano, perň nella tua linea di comando vedo un paio di caratteri " di troppo
e una & mancante.
 
Puoi fare in ogni caso:
 
PROGRAMMI = wshShell.ExpandEnvironmentStrings ("%ProgramFiles(x86)%")
 
PROGRAMMI =  Chr(34) & PROGRAMMI & Chr(34)
 
Le " in piů non fanno mai male.
Poi per vedere cosa effettivamente passi alla .Run puoi fare:
 
CMD = "cmd /c " & PROGRAMMI  & "\nome\nome.exe"
 
MsgBox CMD ' Per esaminare la stringa
 
Infine gli dai il comando:
 
wshShell.Run  CMD, 0 ,True 
 
 
-- 
ciao
  Stefano

CMD = "cmd /c " & PROGRAMMI  & "\nome\nome.exe"
 
Dimenticavo, il "cmd /c " che passa dal prompt per eseguire un programma č
superfluo, puoi fare semplicemente:
 
CMD =  PROGRAMMI  & "\nome\nome.exe"
 
MsgBox CMD ' Per esaminare la stringa
 


cancellare un file.
 
Si, il VBS nasce come derivazione dal Visual Basic e ha in comune diversi
comandi, anche se alla fine è un po' diverso, ed è stato soppiantato dal JS
.
A me che le graffe sono sempre stare sullo stomaco piace di più il VBS.
E consente di fare in modo semplice cose in apparenza complicate:
 
Il programma Vbs che segue ad esempio ti dirà quanti giorni hai vissuto:
 
 
Dat1 = InputBox ("Data di nascita: ",,"30/09/2002")
If IsDate (Dat1) Then
   MsgBox "Hai vissuto " & DateDiff ("d",CDate(Dat1),Date) & " Giorni"
Else :MsgBox Dat1 & " DATA NON VALIDA" ,16 ,"Differenza Giorni"
End If 
 
 
-- 
ciao
  Stefano

 E consente di fare in modo semplice cose in apparenza complicate:
 
Ma un elenco di funzioni utilizzabili in un file bat?
Ormai e' andato tutto perduto.
 
Tempo fa avevo usato in un file batch la seguente cosa:
 
IF "%PROCESSOR_ARCHITECTURE%"=="" GOTO 32_BIT_OS
 
 
Dici che non e' possibile operare sulle stringhe con un batch?
Qualcosa da leggere? 
 
 

 e una & mancante.
 
Cosi' partiva:
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.run "cmd /c ""C:\Program Files (x86)\none\nome.exe""",0,True
 
 
Nel tuo esempio invece c'era un " di troppo: il secondo dopo PROGRAMMI, 
nella terza riga.
(trovato grazie al MsgBox, senno' col fischio che me ne accorgevo)
 
Set wshShell = CreateObject( "WScript.Shell" )
 
PROGRAMMI = wshShell.ExpandEnvironmentStrings ("%ProgramFiles(x86)%")
PROGRAMMI =  Chr(34) & PROGRAMMI
 
CMD =  PROGRAMMI  & "\nome\nome.exe"
 
MsgBox CMD ' Per esaminare la stringa
 
Set WshShell = WScript.CreateObject("WScript.Shell")
wshShell.Run  CMD, 0 ,True
 
 
Cmq, funziona tutto.
Grazie sempre.
 
 


 
Non lo so, uso poco i batch, in Vbs si fa cosě:
 
   Bits = GetObject("winmgmts:root\cimv2:Win32_Processor='cpu0'").AddressWidth
 
  Msgbox  Bits 
 
 
-- 
ciao
  Stefano

 'lo scrive in un file
 
Ciao Stefano.
Ho avuto un periodaccio e ho interrotto le tue "lezioni su VBS".
 
Sicuramente le riprendero' ma sappi che mi hai dato una grandissima mano 
nello script che adesso funziona perfettamente.
 
Se avro' modo/tempo/voglia integrero' con la scrittura direttamente su file.
 
Grazie ancora.