PowerShell初探(一)
PowerShell初探(一)
摘抄自:https://docs.microsoft.com/zh-cn/powershell/scripting/overview?view=powershell-7.2
概述
PowerShell 是一種跨平臺的任務自動化解決方案,由命令列 shell、指令碼語言和配置管理框架組成。
作為一種指令碼語言,PowerShell 通常用於自動執行系統管理。 它還用於經常在 CI/CD 環境中生成、測試和部署解決方案。
如何啟動 PowerShell?
- 單擊“Windows PowerShell”快捷方式啟動了 PowerShell 控制檯;
- 右擊“Windows PowerShell”快捷方式,選擇“Run as administrator"
PowerShell 中的三個核心 Cmdlet
-
Get-Command
-
Get-Command
的作用是幫助查詢命令。Get-Command -Noun Process
-
-
Get-Help
-
Get-Help
是多用途命令。Get-Help
幫助你瞭解找到命令後如何使用它們。Get-Help -Name Get-Help
-
-
Get-Member
-
Get-Member
可幫助發現可用於命令的物件、屬性和方法。 -
Get-Service -Name w32time
方法
方法是可執行的操作。 使用 MemberType 引數來縮小
Get-Member
Get-Service
的方法。Get-Service -Name w32time | Get-Member -MemberType Method
正如所見,存在多種方法。 Stop 方法可用於停止 Windows 服務。
(Get-Service -Name w32time).Stop()
-
管道
一個命令的輸出可以用作另一個命令的輸入。例如:
Get-Service -Name w32time | Stop-Service
$CustomObject | Select-Object -Property @{name='Name';expression={$_.Service}} | Stop-Service
別名
獲取別名gcm全稱
Get-Alias -Name gcm
Output
--------------
CommandType Name Version Source
----------- ---- ------- ------
Alias gcm -> Get-Command
獲取命令別名
Get-Alias -Definition Get-Command, Get-Member
Output
-------------
CommandType Name Version Source
----------- ---- ------- ------
Alias gcm -> Get-Command
Alias gm -> Get-Member
比較運算子
例如:
'PowerShell' -eq 'powershell'
Output
--------------
True
'PowerShell' -like '*shell'
Output
--------------
True
'PowerShell' -match '^*.shell$'
Output
--------------
True
#儲存1~10於Numbers,檢視是否包含15
$Numbers = 1..10
$Numbers -contains 15
#字元替換,預設情況下,-Replace 運算子不區分大小寫,而 Replace() 方法區分大小寫。
'SQL Saturday - Baton Rouge' -Replace 'saturday','Sat'
Output
--------------
SQL Sat - Baton Rouge
指令碼編寫
指令碼只是在 PowerShell 控制檯中以互動方式執行的相同或類似命令,只不過它們儲存為 .PS1
檔案。 可以使用一些指令碼構造,如 foreach
迴圈,而不是 ForEach-Object
cmdlet。
PowerShell 的一大優勢是,確定瞭如何為某個項執行某些操作後,就可以很容易地為數百個項執行相同的任務。 只需使用 PowerShell 中多種不同型別的迴圈之一迴圈訪問這些項即可。
ForEach-Object
ForEach-Object
是用於迴圈訪問管道中的項的 cmdlet,例如使用 PowerShell 單行命令。 ForEach-Object
通過管道流式處理物件。
雖然 Get-Command
的 Module 引數接受作為字串的多個值,但僅通過管道輸入按屬性名稱或通過引數輸入接受這些值。 在下面的情形中,如果我想通過管道將兩個字串按值傳遞到 Get-Command
,以便與 Module 引數一起使用,則需要使用 ForEach-Object
cmdlet。
'ActiveDirectory', 'SQLServer' |
ForEach-Object {Get-Command -Module $_} |
Group-Object -Property ModuleName -NoElement |
Sort-Object -Property Count -Descending
Output
--------------
Count Name
----- ----
147 ActiveDirectory
82 SqlServer
在前面的示例中,$_
為當前物件。 從 PowerShell 版本 3.0 開始,可以使用 $PSItem
而不是 $_
。
函式
PowerShell 中有一個批准的謂詞的特定列表,可通過執行 Get-Verb
獲取這些謂詞。
Get-Verb | Sort-Object -Property Verb
簡單函式
PowerShell 中的函式使用函式關鍵字宣告,後面依次跟函式名稱、左大括號和右大括號。 函式將執行的程式碼包含在這些大括號中。
function Get-Version {
$PSVersionTable.PSVersion
}
Get-Version
Output
--------------
Major Minor Build Revision
----- ----- ----- --------
5 1 14393 693
高階函式
新增 CmdletBinding
以將函式轉換為高階函式。
function Test-MrCmdletBinding {
[CmdletBinding()] #<<-- This turns a regular function into an advanced function
param (
$ComputerName
)
Write-Output $ComputerName
}
指令碼模組
將以下兩個函式儲存在名為 MyScriptModule.psm1
的檔案中。
function Get-MrPSVersion {
$PSVersionTable
}
function Get-MrComputerName {
$env:COMPUTERNAME
}
可以用 Import-Module
cmdlet 手動匯入檔案。
Import-Module C:\MyScriptModule.psm1
來自:https://mikefrobbins.com/2013/07/04/how-to-create-powershell-script-modules-and-module-manifests/
將函式另存為 ps1 檔案,我點源將這些函式載入到記憶體中,但我想與其他人共享此工具,以便從中建立模組更有意義。
我只是將現有的 ps1 檔案作為 psm1 檔案儲存在我的模組資料夾中同名的資料夾中,如下圖所示:
使檔案的資料夾和基本名稱相同非常重要。我給它起了一個通用名稱,因為我可能想在未來向這個相同模組的新版本中新增更多功能。我稱它為 MrAuditTool.
此時,它是一個指令碼模組。我們可以看到它包含了哪些命令: