Как удобно вывести путь к Azure SDK csrun.exe? - PullRequest
7 голосов
/ 04 октября 2011

У меня проблемы с перезагрузкой эмулятора вычислений Azure. Чтобы решить эту проблему, я хочу добавить csrun /devfabric:stop вызов к этапу предварительной сборки в решении Visual Studio.

Проблема в том, что csrun.exe находится в C:\Program Files\Windows Azure SDK\v1.4\bin на моем компьютере, и этот путь отсутствует в списке каталогов %PATH%. Я не хочу жестко задавать этот путь в моем решении.

Есть ли способ вывести путь, например, использовать переменную окружения или что-то подобное?

Ответы [ 2 ]

6 голосов
/ 04 октября 2011

Вы можете прочитать путь Azure SDK из реестра по версии. Последняя часть пути - версия ... Ваш код может быть установлен на версию или вы можете перебирать ключи v, чтобы найти самую последнюю версию. Я бы порекомендовал иметь константу для версии, которую вы поддерживаете, и, поскольку вы берете новый SDK в качестве предварительного требования.

HKEY_LOCAL_MACHINE \ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ \ Microsoft \ Microsoft SDKs \ ServiceHosting \ v1.4

Под этими путями есть ключ "InstallPath".

0 голосов
/ 16 ноября 2014

У меня была такая же проблема, и я создал сценарий PowerShell, который устанавливает переменную среды с путем к папке bin SDK. Он автоматически выполнит поиск в реестре и найдет последнюю установленную версию. Он также имеет запасной вариант для альтернативного расположения реестра, в зависимости от того, работает ли ваш скрипт в 32-битном или 64-битном режиме. Надеюсь, это поможет!

Отказ от ответственности: я удалил кое-что из скрипта перед тем, как опубликовать его здесь, и не проверял его впоследствии, но я думаю, что нетрудно отладить / настроить его в соответствии с вашими потребностями.

#the script attempts to perform the following:
#1. look for the HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\ServiceHosting" registry key
#2. if the above key is present then read the child keys and retrieve the largest version number
#3. from the largest version number key retrieve the "InstallPath" string value to determine the path of the latest Azure SDK installation
#4. add an environment variable called "AzureSDKBin" (if not already added) with the path to the "bin" folder of the latest Azure SDK installation

#define the name of the config variable
$azureSDKPathVariable = 'AzureSDKBin'
$azureRegistryKey = 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\ServiceHosting'
$azureAlternateRegistryKey = 'HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Microsoft SDKs\ServiceHosting' #this is in case the PowerShell runs in 32bit mode on a 64bit machine
$azureMatchedKey = ''

#check if the environment variable was already defined
if ([environment]::GetEnvironmentVariable($azureSDKPathVariable,"User").Length -eq 0) {
    'Variable ' + $azureSDKPathVariable + ' is not defined, proceeding...'

    #try reading the registry key
    $keyExists = Get-Item -Path Registry::$azureRegistryKey -ErrorAction SilentlyContinue

    $azureMatchedKey = $azureRegistryKey #make a note that we found this registry key

    #stop if the key does not exist
    if ($keyExists.Length -eq 0) {
        'Could not find registry key in primary location: ' + $azureRegistryKey + ', attempting search in alternate location: ' + $azureAlternateRegistryKey

        #search the alternate location
        $keyExists = Get-Item -Path Registry::$azureAlternateRegistryKey -ErrorAction SilentlyContinue

        $azureMatchedKey = $azureAlternateRegistryKey #make a note that we found this registry key

        if ($keyExists.Length -eq 0) {
            'Could not find registry key for determining Azure SDK installation: ' + $azureAlternateRegistryKey
            'Script failed...'
            exit 1
        }
    }

    'Found Azure SDK registry key: ' + $azureMatchedKey

    #logic for determining the install path of the latest Azure installation
    #1. get all child keys of the matched key
    #2. filter only keys that start with "v" (e.g. "v2.2", "v2.3")
    #3. sort the results by the "PSChildName" property from which we removed the starting "v" (i.e. only the version number), descending so we get the latest on the first position
    #4. only keep the first object
    #5. read the value named "InstallPath" under this object
    $installPath = (Get-ChildItem -Path Registry::$azureMatchedKey | Where-Object { $_.PSChildName.StartsWith("v") } | sort @{expression={ $_.PSChildName.TrimStart("v") }} -descending | Select-Object -first 1| Get-ItemProperty -name InstallPath).InstallPath

    'Detected this Azure SDK installation path: "' + $installPath + '"'

    #set the variable with the "bin" folder
    [Environment]::SetEnvironmentVariable($azureSDKPathVariable, $installPath + 'bin\', "User")

    'Assigned the value "' + [environment]::GetEnvironmentVariable($azureSDKPathVariable,"User") + '" to environment variable "' + $azureSDKPathVariable + '"'
}
else {
    'Environment variable "' + $azureSDKPathVariable + '" is already defined and has a value of "' + [environment]::GetEnvironmentVariable($azureSDKPathVariable,"User") + '"'
}
...