J'ai besoin de lire l'emplacement du dossier temporaire des fichiers ASP.NET de VBScript dans le cadre d'une tâche post-installation dans un programme d'installation créé à l'aide d'un projet de déploiement Visual Studio 2008.
Je pensais faire quelque chose comme ça : p> puis concaténate STRPATH avec "fichiers asp.net temporaires" et être fait avec elle. p> sur un système x64, cependant, je Obtenir la valeur de Wow6432Node (HKLM \ Software \ WOW6432Node \ Microsoft \ ASP.NET \ 2.0.50727.0), qui me donne le chemin-cadre 32 bits (C: \ Windows \ Microsoft.net \ Framework \ V2.0.50727) , mais sur un système X64, je souhaite réellement le chemin 64 bits, c'est-à-dire C: \ Windows \ microsoft.net \ Framework64 \ v2.0.50727. P> Je comprends que cela se produit parce que le fichier .vbs est Exécuter à l'aide de l'hôte de script 32 bits en raison du processus parent (l'installateur) étant 32 bits elle-même. p> Comment puis-je exécuter le script à l'aide de l'hôte de script 64 bits - ou - Comment puis-je lire Les valeurs 64 bits même si le script est exécuté à l'aide de l'hôte de script 32 bits? p> p>
4 Réponses :
Vous ne savez pas de lancer la version de l'hôte de script 64 bits, mais vous devriez pouvoir accéder au registre 64 bits de l'hôte de script 32 bits à l'aide du WMI stdrecrov code>
classe, comme ceci:
Const HKEY_LOCAL_MACHINE = &H80000002 sPath = ReadRegStr (HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\ASP.NET\2.0.50727.0", "Path", 64) WScript.Echo sPath ' Reads a REG_SZ value from the local computer's registry using WMI. ' Parameters: ' RootKey - The registry hive (see http://msdn.microsoft.com/en-us/library/aa390788(VS.85).aspx for a list of possible values). ' Key - The key that contains the desired value. ' Value - The value that you want to get. ' RegType - The registry bitness: 32 or 64. ' Function ReadRegStr (RootKey, Key, Value, RegType) Dim oCtx, oLocator, oReg, oInParams, oOutParams Set oCtx = CreateObject("WbemScripting.SWbemNamedValueSet") oCtx.Add "__ProviderArchitecture", RegType Set oLocator = CreateObject("Wbemscripting.SWbemLocator") Set oReg = oLocator.ConnectServer("", "root\default", "", "", , , , oCtx).Get("StdRegProv") Set oInParams = oReg.Methods_("GetStringValue").InParameters oInParams.hDefKey = RootKey oInParams.sSubKeyName = Key oInParams.sValueName = Value Set oOutParams = oReg.ExecMethod_("GetStringValue", oInParams, , oCtx) ReadRegStr = oOutParams.sValue End Function
Comment faites-vous cela, mais pour vérifier qu'une clé, pas une valeur ?? (Ex: voir si "logiciel \ microsoft \ asp.net \ 2.0.50727.0" existe mais pas la valeur "chemin"
@ DaniellePaquette-Harvey: Vous devez appeler Enumkey code> < / a> au lieu de
getstringvalue code> (avec les paramètres appropriés) et vérifiez si
ooutparams.returnvalue code> est 0. Aussi, voir les réponses dans cette question: Check Si la clé de registre existe .
@ Danielaquequette-Harvey Vous pouvez également interroger la valeur standard oreg.getstringvalue, "logiciel \ microsoft \ asp.net \ 2.0.50727.0" , stdv code>, puis vérifier
isnull (STDV) code>. Technique inspirée de les gars de script i>
Je pense que quelque chose comme ça, mais je n'ai pas réglé sur la manière de traiter les valeurs de sortie.
strComputer = "." Const HKLM = &h80000002 Set objCtx = CreateObject("WbemScripting.SWbemNamedValueSet") objCtx.Add "__ProviderArchitecture", 64 objCtx.Add "__RequiredArchitecture", TRUE Set objLocator = CreateObject("Wbemscripting.SWbemLocator") Set objServices = objLocator.ConnectServer("","root\default","","",,,,objCtx) Set objStdRegProv = objServices.Get("StdRegProv") ' Use ExecMethod to call the GetStringValue method Set Inparams = objStdRegProv.Methods_("EnumValues").Inparameters Inparams.Hdefkey = HKLM Inparams.Ssubkeyname = "SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL\" 'Inparams.Svaluename = "Logging" set Outparams = objStdRegProv.ExecMethod_("EnumValues", Inparams,,objCtx) 'Show output parameters object and the registry value HKLM\SOFTWARE\ WScript.Echo Outparams.GetObjectText_ WScript.Echo "WMI Logging is set to " & Outparams.SValue
S'il vous plaît vérifier ceci: p>
Set Oshell = CreateObject ("wscript.shell") Strpath = oshell.regread ("HKLM64 \ logiciel \ Microsoft \ ASP.NET \ 2.0.50727.0 \ PATH") P>
https://www.autoitscript.com/autoit3/docs/functions/ Regread.htm p>
Le script AutoIt n'est pas VBScript, les fonctions ne sont pas les mêmes
Utilisation de l'approche documentée de Microsoft, la réponse de Helen est absolument correcte.
Toutefois, selon mes propres tests, il s'avère qu'il suffit de spécifier le drapeau contextuel code> uniquement au moment de la connexion. Le fournisseur STDREGPROV est établi.
Cela rend les choses beaucoup plus simples, car seulement la mise en place du fournisseur doit être encapsulée dans une fonction distincte, sinon on peut utiliser l'API régulière. P>
set reg64 = MakeRegLocator(64) reg64.GetStringValue , "SOFTWARE\Microsoft\ASP.NET\2.0.50727.0", "Path", path WScript.Echo path ' Establish a connection to the local 32 or 64 bit registry hive as requested. ' Parameters: ' RegType - The registry bitness: 32 or 64. function MakeRegLocator(bitness) set ctx = CreateObject("WbemScripting.SWbemNamedValueSet") ctx.Add "__ProviderArchitecture", bitness set locator = CreateObject("Wbemscripting.SWbemLocator") set services = locator.ConnectServer("", "root\default", "", "", , , , ctx) set reg = services.Get("StdRegProv") set MakeRegLocator = reg end function