iT邦幫忙

2024 iThome 鐵人賽

DAY 5
1

在 PowerShell 中,Provider 對我來說像是一個工具,讓我能夠用統一的命令( 例如 Get-ChildItem、Set-Item )來瀏覽和管理不同的資料,它將不同的資料存儲抽象成類似檔案系統的結構。

什麼是 Provider

本書中在 5.1 章節解釋

PowerShell 的 Provider,或稱為 PSProvider,是一種轉接器( adapter )。它被設計用來轉換某些類型的資料儲存區( data storage ),例如 Windows Registry、Active Directory,甚至是本機的檔案系統,使他們看起來像是一個磁碟機。

https://ithelp.ithome.com.tw/upload/images/20240919/20168708gCFtdpnz20.png

列出目前 Provider

https://ithelp.ithome.com.tw/upload/images/20240919/20168708jchVh0aE8u.png

針對 Capabilities 書中有特別解釋

ShouldProcess

https://ithelp.ithome.com.tw/upload/images/20240919/201687083Vtb4Z9z5a.png

支援使用 -WhatIf 和 -Confirm 參數,讓你在確定進行某些操作之前先「測試」它們。
https://ithelp.ithome.com.tw/upload/images/20240919/20168708mewfq2BnOr.png

Filter

支援 cmdlet 的 -Filter 參數,來操作 Provider 的內容。

Credentials

允許你在連線到資料存放區時,能指定其他的憑證。有一個對應的參數 -Credential 可供使用。


PSDrive

你會使用 Provider 來建立一個 PSDrive。PSDrive 會使用一個 Provider 來連線到資料儲存區。你正在做的就是建立磁碟機的對應( mapping ),而且得益於 Provider,PSDrive 可以連線的不僅僅是磁碟機。

PS /> PSDrive
Name           Used (GB)     Free (GB) Provider      Root
----           ---------     --------- --------      ----
/                 116.31        344.12 FileSystem    /   
Alias                                  Alias
Env                                    Environment
Function                               Function
Temp              116.31        344.12 FileSystem    /var/folders/34/39lt5k9n6mdg8jsp81…
Variable                               Variable

一個 PSDrive 可以被對應到 Environment、Registry,甚至是 SCCM 的端點,這些顯然都不是檔案系統,因此,PowerShell 不採用 file 和 folder 這些術語。相反的,它使用更通用的術語,即 Item,來稱呼這些物件。檔案和資料夾都會被視為是項目。

當一個 Item 能夠包含其他項目時,它被稱為「容器」(Container)。例如,資料夾和註冊表就是容器,因為它們可以包含子項目。這意味著當一個 Item 是資料夾時,它會有子項目,即包含在該資料夾下的其他 Item,這些子項目可能是檔案或其他資料夾。
不同類型的 Item 具有不同的屬性和方法。檔案可能有大小、擴展名等屬性,而環境變數則有名稱和值等屬性。PowerShell 提供了一組一致的命令,如 Get-Item、Set-Item、Remove-Item 等,讓你可以以相同的方式操作不同類型的 Item,無論它們來自何種資料來源。透過這種統一的方式,便可在不同的資料來源之間進行一致且有效的操作。

操作 Item

大方向

透過 get-command 搜尋名稱包含 item 的 cmdlet,再依據「動詞-名詞」的命名規則加上 get-help 去確認 command。

https://ithelp.ithome.com.tw/upload/images/20240919/20168708s168bxctOt.png
https://ithelp.ithome.com.tw/upload/images/20240919/20168708ZGRknQdC0c.png

透過 Set-Location 切換目錄

# 類似於 Bash 的 cd
PS /Users/kanglin> Set-Location -Path /
PS />

建立新 item

https://ithelp.ithome.com.tw/upload/images/20240920/20168708U7kz5gjk3C.png

使用萬用字元或字面字元?

在 Get-ChildItem 裡透過 Get-Help 可以看到有兩組參數集,第一組用 -LiteralPath,第二組用 -Path,透過 Get-Help 看更多可以看到 -Path 支援萬用字元,而當路徑中有包含 ? 或 * 時,則需要使用 -LiteralPath。

PS /> get-help Get-ChildItem

SYNTAX
    Get-ChildItem [[-Filter] <System.String>] [-Attributes {Archive | Compressed | Device | Directory | Encrypted | Hidden | IntegrityStream | Normal | NoScrubData | NotContentIndexed | Offline | ReadOnly |
    ReparsePoint | SparseFile | System | Temporary}] [-CodeSigningCert] [-Depth <System.UInt32>] [-Directory] [-DnsName <Microsoft.PowerShell.Commands.DnsNameRepresentation>] [-DocumentEncryptionCert] [-Eku
    <System.String>] [-Exclude <System.String[]>] [-ExpiringInDays <System.Int32>] [-File] [-FollowSymlink] [-Force] [-Hidden] [-Include <System.String[]>] -LiteralPath <System.String[]> [-Name] [-ReadOnly]
    [-Recurse] [-SSLServerAuthentication] [-System] [<CommonParameters>]

    Get-ChildItem [[-Path] <System.String[]>] [[-Filter] <System.String>] [-Attributes {Archive | Compressed | Device | Directory | Encrypted | Hidden | IntegrityStream | Normal | NoScrubData | NotContentInd
    exed | Offline | ReadOnly | ReparsePoint | SparseFile | System | Temporary}] [-CodeSigningCert] [-Depth <System.UInt32>] [-Directory] [-DnsName <Microsoft.PowerShell.Commands.DnsNameRepresentation>] [-Do
    cumentEncryptionCert] [-Eku <System.String>] [-Exclude <System.String[]>] [-ExpiringInDays <System.Int32>] [-File] [-FollowSymlink] [-Force] [-Hidden] [-Include <System.String[]>] [-Name] [-ReadOnly] [-R
    ecurse] [-SSLServerAuthentication] [-System] [<CommonParameters>]

PS /> get-help Get-ChildItem -Parameter Path

-Path <System.String[]>
    Specifies a path to one or more locations. Wildcards are accepted. The default location is the current directory (`.`).

    Required?                    false
    Position?                    0
    Default value                Current directory
    Accept pipeline input?       True (ByPropertyName, ByValue)
    Accept wildcard characters?  true

PS /> Get-ChildItem -Parameter LiteralPath

-LiteralPath <System.String[]>
    Specifies a path to one or more locations. The value of LiteralPath is used exactly as it's typed. No characters are interpreted as wildcards. If the path includes escape characters, enclose it in single
     quotation marks. Single quotation marks tell PowerShell to not interpret any characters as escape sequences.

    For more information, see about_Quoting_Rules (../Microsoft.Powershell.Core/About/about_Quoting_Rules.md).

    Required?                    true
    Position?                    named
    Default value                None
    Accept pipeline input?       True (ByPropertyName)
    Accept wildcard characters?  false

明日主題

Day 6 - 管線:串接命令


上一篇
Day 4 - 執行命令
下一篇
Day 6 - 管線:串接命令
系列文
《30天挑戰精通 PowerShell:從 Windows Server 到 Azure DevOps 自動化之旅》30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言