2009-04-28 4 views
3

Я пытаюсь прочитать значение из записи реестра с помощью Powershell. Это довольно просто, однако один конкретный раздел реестра дает мне проблемы.Ошибка получения значения реестра с помощью Powershell

Если я запустил следующее, я не могу получить значение (по умолчанию) «$ setting».

C:\Program Files\PowerGUI> $setting = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\IniFileMapping\Autorun.inf" 

C:\Program Files\PowerGUI> $setting 


PSPath  : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\ 
       CurrentVersion\IniFileMapping\Autorun.inf 
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\ 
       CurrentVersion\IniFileMapping 
PSChildName : Autorun.inf 
PSDrive  : HKLM 
PSProvider : Microsoft.PowerShell.Core\Registry 
(default) : @SYS:DoesNotExist 

Обычно я бы установил $ setting.Attribute или $ setting (по умолчанию). Тем не менее, что приводит к следующей ошибке:

C:\Program Files\PowerGUI> $setting.(default) 
The term 'default' is not recognized as a cmdlet, function, operable program, or script file. Verify the term and try again. 
At :line:1 char:17 
+ $setting.(default <<<<) 

Как получить значение «(по умолчанию)» атрибут?

Заранее спасибо.

ответ

8

EDIT Пришлось просмотреть и старый сценарий, чтобы понять это.

Фокус в том, что вам нужно заглянуть внутрь базового объекта PSObject, чтобы получить значения. В частности, рассмотреть мешок свойств

$a = get-itemproperty -path "HKLM:\Some\Path" 
$default = $a.psobject.Properties | ?{ $_.Name -eq "(default)" } 

Вы также можете просто использовать индексатор вместо того, чтобы делать фильтр трюк

$default = $a.psobject.Properties["(default)"].Value; 
+0

Чтобы добавить к этому, в исходном коде() проинструктировано PowerShell для лечения текста (в данном случае «По умолчанию») в качестве отдельной команды. Когда у вас есть свойства, у которых есть такие необычные символы, вам нужно указать (и иногда использовать $()) значение, подобное JaredPar, показанное так, чтобы PowerShell не интерпретировал значение как выражение. Другие персонажи, на которые нужно обратить внимание, равны $. : '' (может быть больше, но это все, что я могу запомнить) – JasonMArcher

+2

Использование $ setting. '(default)', чтобы избежать скобок также работает. –

+0

Для полноты, второй пример действительно требует .Value в конце , – cristobalito

4

Другой вариант:

(Get-ItemProperty HKLM»: \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ IniFileMapping \ Autorun.inf ').' (По умолчанию) '

3

Используйте Get-Item, чтобы получить объект, представляющий раздел реестра:

PS > $regKey = Get-Item HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\IniFileMapping\Autorun.inf 

Это дает вам пример RegistryKey. RegistryKey имеет метод с именем GetValue; если аргумент GetValue является пустая строка (''), то он возвращает значение (default):

PS > $regKey.GetValue('') 

Почему это лучше, чем Get-ItemProperty? Он более естественно распространяется на Get-ChildItem. Get-ChildItem предоставит вам список RegistryKey объектов. В моем конкретном случае, я хотел бы перечислить установки пути версий Python установлены на моей машине:

PS C:\> get-childitem HKLM:\SOFTWARE\Wow6432Node\Python\PythonCore\*\InstallPath ` 
>> | foreach-object { $_.GetValue('') } 
C:\Python26\ArcGIS10.0\ 
C:\Python\27\ 
Смежные вопросы