《Windows Powershell 實戰指南》第5章筆記

第5章 提供程序

1. 什麼是提供程序

1.1 概念

提供程序(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盤同樣,下一步才能選擇其中的文件和數據。對象

1.2 功能描述

從 Get-PSProvider的執行結果能夠看出每一個提供程序都有各自不一樣的功能。這一點很重要,由於這決定了咱們如何使用這些提供程序。下面是常見的一些功能描述:接口

  • ShouldProcess——代表該提供程序支持-whatif-confirm參數,保證咱們正式執行這部分腳本以前能夠對他們進行測試。
  • Filter——代表在Cmdlet中操做提供程序的數據時,支持-Filter參數。
  • Credentials——代表該提供程序容許使用可變動的憑據去鏈接數據存儲。這也是-Credentials參數的做用。
  • Transactions——代表該提供程序支持事務操做,也就是容許你在該提供程序中將過個變動做爲一個原子操做進行提交或者所有回滾。

2. 文件系統的結構

2.1 文件系統

Windows文件系統主要由三種對象組成:磁盤驅動器、文件夾和文件。磁盤驅動器是最上層的對象,包含文件夾和文件。文件夾是一種容器對象,它能夠包含文件以及其餘文件夾。文件不是容器對象,它能夠算做最小單位的對象。事務

2.2 Item的來源和操做命令

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

對上面的命令名稱構成的一些解釋:文檔

  • 好比Clear,Copy,Get,Move,New,Remove,Rename 和 Set 等動詞能夠應用於這些項(包括文件夾和文件)以及它們的屬性(好比最後修改時間、只讀等)。
  • 名詞部分只包括一個「Item」,能夠應用於文件或文件夾的操做。
  • 名詞部分是「ItemProperty」,表明一個項對應的屬性,好比只讀、建立時間、大小等。
  • 名詞部分是「ChildItem」表明一個項(文件或文件夾)包含在另外一個項中(文件夾)。

2.3 使用命令

上面的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

3. 使用文件系統

在使用提供程序時,首先須要熟悉的命令爲 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

4. 使用通配符以及絕對路徑

大部分的 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不能隱式賦予,使用時必須寫上參數名稱。

相關文章
相關標籤/搜索