提供程序(PSProvider):本質上是一個適配器。它能夠像訪問磁盤驅動器同樣訪問某些數據存儲介質。shell
驅動程序(PSDrive):驅動程序可經過一個特定的提供程序去鏈接到某些存儲數據的介質。ide
獲取本機上的提供程序:測試
PS C:\Windows\system32> Get-PSProvider Name Capabilities Drives ---- ------------ ------ Registry ShouldProcess, Transactions {HKLM, HKCU} Alias ShouldProcess {Alias} Environment ShouldProcess {Env} FileSystem Filter, ShouldProcess, Credentials {C, D, E, F} Function ShouldProcess {Function} Variable ShouldProcess {Variable}
經過Get-PSProvider的執行結果,觀察提供程序和驅動程序二者的關係。若是用磁盤和分區來類比的話,提供程序就是一塊磁盤,驅動程序就是這塊磁盤上劃分的幾個分區。要想訪問磁盤上的數據必須先進入某個分區,咱們沒法繞過度區直接打開或修改磁盤上的數據。code
因此Registry、Alias、Environment等提供程序就是存儲數據的底層介質,HKLM,、HKCU、Alias、Env等驅動程序就是上層的分區。而咱們要想訪問這些介質中的數據,必須先打開HKLM,、HKCU、Alias等驅動程序,就像打開C盤、D盤同樣,下一步才能選擇其中的文件和數據。對象
從 Get-PSProvider的執行結果能夠看出每一個提供程序都有各自不一樣的功能。這一點很重要,由於這決定了咱們如何使用這些提供程序。下面是常見的一些功能描述:接口
-whatif
和-confirm
參數,保證咱們正式執行這部分腳本以前能夠對他們進行測試。-Filter
參數。-Credentials
參數的做用。Windows文件系統主要由三種對象組成:磁盤驅動器、文件夾和文件。磁盤驅動器是最上層的對象,包含文件夾和文件。文件夾是一種容器對象,它能夠包含文件以及其餘文件夾。文件不是容器對象,它能夠算做最小單位的對象。事務
Powershell中的術語和文件系統中的略有不一樣。由於PSDrive 可能並非指向某個文件系統——好比PSDrive能夠映射到註冊表,因此powershell並不會使用「文件」和「文件夾」的說法。相反,powershell採用更通俗的說法「項」(Item)。一個文件或者文件夾都叫項,儘管本質他們是不一樣的。因此powershell中操做對象的命令都包含「Item」字符。使用下列命令搜索包含「Item」的Cmdlet:ci
PS C:\> Get-Command -Noun *Item* CommandType Name Version Source ----------- ---- ------- ------ Function Get-DAEntryPointTableItem 1.0.0.0 DirectAccessClientComponents Function Get-TestDriveItem 3.4.0 Pester Function New-DAEntryPointTableItem 1.0.0.0 DirectAccessClientComponents Function Remove-DAEntryPointTableItem 1.0.0.0 DirectAccessClientComponents Function Rename-DAEntryPointTableItem 1.0.0.0 DirectAccessClientComponents Function Reset-DAEntryPointTableItem 1.0.0.0 DirectAccessClientComponents Function Set-DAEntryPointTableItem 1.0.0.0 DirectAccessClientComponents Cmdlet Add-ClusterVMMonitoredItem 2.0.0.0 FailoverClusters Cmdlet Clear-Item 3.1.0.0 Microsoft.PowerShell.Management Cmdlet Clear-ItemProperty 3.1.0.0 Microsoft.PowerShell.Management Cmdlet Copy-Item 3.1.0.0 Microsoft.PowerShell.Management Cmdlet Copy-ItemProperty 3.1.0.0 Microsoft.PowerShell.Management Cmdlet Get-ChildItem 3.1.0.0 Microsoft.PowerShell.Management Cmdlet Get-ClusterVMMonitoredItem 2.0.0.0 FailoverClusters Cmdlet Get-ControlPanelItem 3.1.0.0 Microsoft.PowerShell.Management Cmdlet Get-Item 3.1.0.0 Microsoft.PowerShell.Management Cmdlet Get-ItemProperty 3.1.0.0 Microsoft.PowerShell.Management Cmdlet Get-ItemPropertyValue 3.1.0.0 Microsoft.PowerShell.Management Cmdlet Invoke-Item 3.1.0.0 Microsoft.PowerShell.Management Cmdlet Move-Item 3.1.0.0 Microsoft.PowerShell.Management Cmdlet Move-ItemProperty 3.1.0.0 Microsoft.PowerShell.Management Cmdlet New-Item 3.1.0.0 Microsoft.PowerShell.Management Cmdlet New-ItemProperty 3.1.0.0 Microsoft.PowerShell.Management Cmdlet Remove-ClusterVMMonitoredItem 2.0.0.0 FailoverClusters Cmdlet Remove-Item 3.1.0.0 Microsoft.PowerShell.Management Cmdlet Remove-ItemProperty 3.1.0.0 Microsoft.PowerShell.Management Cmdlet Rename-Item 3.1.0.0 Microsoft.PowerShell.Management Cmdlet Rename-ItemProperty 3.1.0.0 Microsoft.PowerShell.Management Cmdlet Set-Item 3.1.0.0 Microsoft.PowerShell.Management Cmdlet Set-ItemProperty 3.1.0.0 Microsoft.PowerShell.Management Cmdlet Show-ControlPanelItem 3.1.0.0 Microsoft.PowerShell.Management
對上面的命令名稱構成的一些解釋:文檔
上面的Cmdlet都是通用的,由於它們須要處理各類不一樣的數據源。可是須要注意的是,某些Cmdlet在特定場合下不必定能正常工做。就是說全部的提供程序都支持這些 Cmdlet 的使用,可是不支持部分參數的使用。從提供程序的功能描述部分(1.2節)中能夠找到緣由。string
例如:文件系統不支持事務,因此在文件系統驅動器下使用命令時都不支持-UseTransaction
參數;註冊表不支持 Filter 功能,因此在註冊表驅動器中使用命令時,也不能使用-Filter
參數。
另外某些 PSProvider 並不具備對應的項屬性。好比 Environment 提供程序主要的做用是訪問Windows 中的環境變量,但它並無任何項屬性:
PS C:\> Get-ItemProperty -Path Env:\PSModulePath Get-ItemProperty : 沒法使用接口。此提供程序不支持 IPropertyCmdletProvider 接口。 所在位置 行:1 字符: 1 + Get-ItemProperty -Path Env:\PSModulePath + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotImplemented: (:) [Get-ItemProperty], PSNotSupportedException + FullyQualifiedErrorId : NotSupported,Microsoft.PowerShell.Commands.GetItemPropertyCommand
在使用提供程序時,首先須要熟悉的命令爲 Set-Location。它的功能是將Shell中當前路徑變動爲不一樣的路徑。使用 Set-Location命令進入不一樣的驅動程序,必須在驅動程序末尾加上:\
(這裏使用斜槓效果也是同樣的:/
),例如:
PS C:\> Set-Location d:\ PS D:\> Set-Location env:\ PS Env:\> Set-Location Function:\ PS Function:\> Set-Location HKCU:\ PS HKCU:\>
建立一個新的項的命令是 New-Item,因爲該命令在全部提供程序中都能使用,因此使用時必須指定新項的類型,例如文件夾、文件或者註冊表。例如:
PS C:\> New-Item -Name 123 -ItemType Directory 目錄: C:\ Mode LastWriteTime Length Name ---- ------------- ------ ---- d----- 2019/4/2 22:28 123
大部分的 Cmdlet 都包含-Path
參數,默認狀況下該參數支持通配符。例如咱們查看 Get-ChildItem 的幫助文檔中關於-Path
參數的部分:
PS C:\> help Get-ChildItem -Parameter path -Path <String[]> Specifies a path to one or more locations. Wildcards are permitted. The default location is the current directory (.). 是否必需? False 位置? 0 默認值 Current directory 是否接受管道輸入? True (ByPropertyName, ByValue) 是否接受通配符? True
*
通配符代碼0個或多個字符,?
通配符僅表明單個字符。因爲它們是通配符,因此在文件夾或文件的名稱中不容許使用這兩個字符。可是在其餘類型的數據存儲中,Item 的名稱中是能夠包含*
和?
的。例如註冊表中的項名稱就可使用*
和?
,這就致使一個問題。當一個路徑參數中使用了*
和?
powershell該如何識別,是做爲通配符仍是名稱中的一個字符。針對該問題,powershell給出的解決辦法是增長一個參數-LiteralPath
。
PS C:\> help Get-ChildItem -Parameter liter* -LiteralPath <String[]> Specifies, as a string arrya, a path to one or more locations. Unlike the Path parameter, the value of the LiteralPath parameter is used exactly as it is typed. No characters are interpreted as wildcards. If the path includes escape characters, enclose it in single quotation marks. Single quotation marks tell Windows PowerShell not to interpret any characters as escape sequences. 是否必需? True 位置? named 默認值 None 是否接受管道輸入? True (ByPropertyName) 是否接受通配符? False
若是要查詢的名稱中帶有*
和?
,就要使用-LiteralPath
參數,而不能使用-Path
。注意-LiteralPath
不能隱式賦予,使用時必須寫上參數名稱。