2016-01-15 25 views
-1

顯然,我的Google-fu在尋找透徹而易懂的教程時,很難找到如何在Powershell腳本中使用Windows註冊表(而不是在PS外殼中交互式地)。註冊表使用「key-name-value」結構但以某種方式訪問​​「與文件系統目錄相同」的事實只是簡單地使我感到困惑。如何使用Powershell來使用註冊表?

假設我有一個註冊表是:

HKLM 
    KeyA 
    NameA1=ValueA1 
    KeyB 
    NameB1=ValueB1 
    KeyC 
    NameC1=ValueC1 
    NameC2=ValueC2 
    NameC3=ValueC3 
    KeyCA 
     NameCA1=ValueCA1 
    KeyCB 
     NameCB1=ValueCB1 

什麼做的最正確的方法*以下內容:

  1. 檢查是否存在KeyA
  2. 檢查NameB1是否存在?
  3. 考慮到我不知道該項目的名稱(只有密鑰的路徑),獲取密鑰中第一個/唯一項目的名稱和數值部分(例如,NameC1ValueC1)?
    • 目前,我粗略地用Get-ItemProperty獲得@{name=value}並應用一些字符串分割。
  4. (更一般地說:)在KeyC(所以NameC1, NameC2, NameC3)中的所有名稱進行迭代,因爲可能有零個或多個項目?
  5. KeyC(so KeyCA, KeyCB)中的所有子項進行迭代,因爲可能有零個或多個項目?
  6. 重命名密鑰(例如,NameB1NameB2);或者創建一個具有相同類型和值的新密鑰,並刪除舊密鑰?
  7. 更改一個值(說,ValueC3ValueC5),因爲我知道關鍵和名稱?

我知道我可以使用Get-ChildItem做一些事情,Get-ItemProperty給別人使用,但是我不明白這一點,我正在摸索着運氣。我如何最好地將這些應用於我列出的需求?

*(相關,但題外話:什麼是相當於「Python化」爲PowerShell的?)

+0

與我在這裏的其他問題的措辭不同,我確實期待一些反彈;目前爲-1,這似乎是這種情況。我明白並希望,如果你不贊成,你會與我溝通,因爲單靠這個號碼是沒有幫助的。 – KlaymenDK

回答

2

我試圖回答下面每個你的問題,但我建議您閱讀help file about PS Providers(中

help about_Providers 

檢查是否存在科亞:該註冊表映射爲一個文件系統抽象層)?

由於註冊表被映射像一個文件系統,你可以使用Test-Path

PS> Test-Path HKLM:\KeyA 
True 

檢查是否存在NameB1?

名稱 - 值對像對待由註冊商項目屬性,檢查是否Get-ItemProperty返回什麼:

PS>[bool](Get-ItemProperty HKLM:\KeyA -Name NameB1) 
True 

獲取所述名稱和第一的增值部分/只有項內的一個鍵(說,NameC1和ValueC1),因爲我不知道該項目的名稱(只有該鍵的路徑)?

此外,註冊表可以像文件系統一樣對待,您可以使用Get-Item來檢索任何密鑰。與實際文件系統的區別在於返回的對象類型爲Microsoft.Win32.RegistryKey而不是System.IO.FileInfo。註冊表項對象有一個GetValueNames()方法,你可以用它來檢索值名稱:

PS> $RegKey = Get-Item HKLM:\KeyC 
PS> $RegKey.GetValueNames() 
NameC1 
NameC2 
NameC3 

只得到了第一個:如果你想只是

PS> $RegKey = Get-Item HKLM:\KeyC 
PS> $ValueName = $RegKey.GetValueNames() |Select-Object -First 1 
PS> Get-ItemProperty $RegKey.PSPath -Name $ValueName |Select-Object $ValueName 

,使用-ExpandPropertySelect-Object

PS> Get-ItemProperty $RegKey.PSPath -Name $ValueName |Select-Object -ExpandProperty $ValueName 

對KeyC中的所有名稱進行迭代(因此NameC1,NameC2,NameC3),因爲可能有零個或多個項目?

再次使用GetValueNames()方法:

foreach($ValueName in ($Key = Get-Item HKLM:\KeyC).GetValueNames()) 
{ 
    "{0} has value {1}" -f $ValueName,$Key.GetValue($ValueName) 
} 

遍歷在KeyC(所以KeyCA,KeyCB)所有子項,考慮到有可能是零個或多個項目?

使用Get-ChildItem,你會在一個普通的文件系統:

PS> Get-ChildItem HKLM:\KeyC |Select -ExpandProperty Name 
HKEY_LOCAL_MACHINE\KeyC\KeyCA 
HKEY_LOCAL_MACHINE\KeyC\KeyCB 

重命名鍵(比如,NameB1到NameB2);或者創建一個具有相同類型和值的新密鑰,並刪除舊密鑰?

對於(即KeyC),使用Rename-Item

Rename-Item HKLM:\KeyC -NewName KeyD 

對於值名稱(即NameB1),使用Rename-ItemProperty

Rename-ItemProperty HKLM:\KeyB -Name NameB1 -NewName NameB2 

獎金的問題:

*(相關,但偏離主題:?什麼是「Python化」爲PowerShell中的等價物)

我不認爲PowerShell中已經有足夠長的等效項,但我個人會使用PowerShell-idiomatic或者「PowerShellian」:D

+0

「_返回的對象是'Microsoft.Win32.RegistryKey'_」類型 - 是否有一個在線參考,以及此對象可以做什麼?我希望微軟在他們的[文檔](https://technet.microsoft.com/en-us/library/hh849851.aspx)中包含或鏈接到這些信息([就像甲骨文一樣](https://docs.oracle.com)的.com/JavaSE的/ 7 /文檔/ API /爪哇/郎/ String.html))。我剛剛發現[Get-Member](https://technet.microsoft.com/en-us/library/hh849928.aspx),這對修補程序來說可以,但對我無效(使用PS v2.0) 。 – KlaymenDK

+3

[Microsoft提供了大量文檔](https://msdn.microsoft.com/en-us/library/microsoft.win32.registrykey(v = vs.110).aspx):) –

+0

但是我沒有使用C# ,C++,F#或VB;我正在使用PS(v2)。我不知道如何'翻譯'... – KlaymenDK

相關問題