PowerShell 筆記 - 基礎篇

Chinor 發表於 2022-05-18

基礎

檢視powershell版本

PS C:\Users\chino> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      5.1.22000.653
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.22000.653
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1


檢視簡易幫助文件

help cmdlet  ##例如 help Get-Service

如果沒有幫助文件, 需要先執行以下命令更新幫助文件(需要以管理員執行)

Update-Help

如果計算機無法上網, 可以用以下方式離線來安裝幫助文件
先從已經安裝幫助文件的機器執行以下命令

Save-Help -DestinationPath ./

從另一臺伺服器執行以下命令裝載幫助文件

Update-Help -SourcePath ./

使用幫助系統查詢命令, 例如想查詢系統事件日誌, 卻不知道使用哪個命令, 可以執行以下命令

Help *log*
Help *event*

或者使用Get-Command (簡寫gcm) 查詢cmdlet命令

gcm *log*
get-help cmdlet --detailed  檢視詳細幫助, 相當於man
get-help cmdlet --examples  檢視樣例

常用的引數型別

  • string, 數字字母和空格, 如果出現空格符, 全部字串必須包含在引號內部, 最好用單引號.
  • Int, Int32或Int64, 一個整數型別, 不包含小數
  • DateTime, 時間日期型別

如果引數型別為資料集合, 可以使用, 隔開, 例如

Get-EventLog Security -computer server1,DC4,file2

可選引數與必選引數 / 位置引數

例如 Get-Help
Get-Help [[-Name] <string>] [-Path <string>] [-Category {Alias | Cmdlet | Provider | General | FAQ | Glossary | HelpFile | ScriptCommand | Function | Filter | ExternalScript | All | DefaultHelp | DscResource | Class | Configuration}] [-Full] [-Component <string[]>] [-Functionality <string[]>] [-Role <string[]>] [<CommonParameters>]
    
[[-Name] <string>] 是一個位置引數, 因為引數名稱在一個方括號內, 同時還是一個可選引數, 因為引數名稱和引數值位於同一個方括號內.

位置引數可以不用指定引數名, 比如Get-Help Get-EventLog 可以直接執行而不用指定 -Name 引數名.
最佳實踐是總是指定引數名, 熟練以後再使用位置引數來節省時間

Cmdlet 的命名慣例,以標準的動詞開始比如Get, Set, New, 或Pause

powershell中的別名: 只是命令的一個暱稱, 無法包含任何引數

使用快捷方式:

  • 簡化引數名稱: powershell不要求輸入完整的引數名稱, 例如可以用-comp代替-ComputerName , 必須是唯一識別引數所需要輸入的最少的部分. 比如在引數-ComputerName-Composit 都存在的情況
  • 引數名稱別名. 例如 Get-Command Get-EventLog | select -ExpandProperty parameters 可以檢視別名, -Cn 就是 -ComputerName 的別名
  • 位置引數. 例如Get-ChildItem C:\ 替代 Get-ChildItem -Path C:\

Show-Command cmdlet 命令可以在windows上以GUI的方式列出命令的引數名稱

Powershell 提供程式(PSProvider)

PSProvider,其本質上是一個介面卡。它可以接受某些資料儲存,並使得這些介質看起來像是磁碟驅動器一樣。你可以通過下面的命令檢視當前Shell中已經存在的提供程式.

Get-PSProvider

Name                 Capabilities                                        Drives
----                 ------------                                        ------
Alias                ShouldProcess                                       {Alias}
Environment          ShouldProcess                                       {Env}
FileSystem           Filter, ShouldProcess, Credentials                  {/, Temp}
Function             ShouldProcess                                       {Function}
Variable             ShouldProcess                                       {Variable}

可以通過模組或者一些管理單元來將一些提供程式新增到powershell中, 這也是powershell僅支援的兩種擴充套件方式. 如果啟用了某些powershell功能, 可能也會新增一個PSProvider, 比如開啟了遠端處理時, 會新增 WSMan Credentials

PSProvider常見的功能描述:

  • ShouldProcess 提供支援-WhatIf-Confirm引數, 保證我們在正式執行這部分指令碼之前可以對它們進行測試
  • Filter 在cmdlet中操作提供程式的資料時, 支援-Filter引數
  • Credentials 改提供程式允許使用可變更的憑據連線資料儲存, 這也就是-Credentials引數的作用
  • Transactions 該提供程式支援事務, 也就是允許在改提供程式中將多個變更作為一個原子操作進行提交或者全部回滾

可以使用某個提供程式建立一個PSDrive, PSDrive可以通過一個特定的提供程式連線到某些儲存資料的介質, 這和在windows資源管理器中類似, 本質上是建立一個驅動器對映, 但是由於PSDrive使用了提供程式, 除了可以連線磁碟以外, 還能連線更多的資料儲存介質, 執行Get-PSDrive 可以看到當前已經連線的驅動器.
可以通過一系列cmdlets去查閱和操作每個PSDrive呈現出來的資料, 大多數情況下, 操作PSDrive的cmdlet名詞部分都會包含item. 可以通過Get-Command -noun *Item* 檢視這些cmdlets

PSProvider常規檔案操作

Windows 檔案系統包括三部分: 磁碟驅動器, 資料夾, 檔案.
PSDrive指向的物件都稱為Item, Item可以是檔案, 資料夾

切換目錄

Set-Location -Path 'C:\Windows' # 等同於cd 'C:\Windows'

建立一個項Item

New-Item -ItemType directory folder # ItemType不指定預設建立檔案型別的Item

Mkdir 也可以建立資料夾, 但Mkdir是一個function, 隱式呼叫了New-Item, 並指定ItemType為directory

powershell 可以使用?* 萬用字元, 如果檔名字中包含?或者*. 可以用-LiteralPath 引數. 該引數不支援任何萬用字元, 嚴格按照鍵入的值使用.

檢視所有的PSDrive

Get-PSDrive
## 此處為mac下執行, windows下可以看到登錄檔型別HKCU, HKLM 等
Name           Used (GB)     Free (GB) Provider      Root                                    CurrentLocation
----           ---------     --------- --------      ----                                    ---------------
/                 226.26        239.37 FileSystem    /                                                   tmp
Alias                                  Alias                                                                
Env                                    Environment                                                          
Function                               Function                                                             
Temp              226.26        239.37 FileSystem    /var/folders/zp/53pdcbdj4q7g7d_sf6…                    
Variable                               Variable 

PSProvider操作登錄檔

Set-Location -Path HKCU:
Set-Location xxx   ## 選中要修改的登錄檔路徑
Set-ItemProperty -Path DWM -PSProperty EnableColorization -Value 0  ## 設定

注意: Set-Item 無法作用於FileSystem的Provider, 修改檔案內容用Set-Content