Home >> Blog >> 什麼是 PowerShell 以及為什麼要使用它?
什麼是 PowerShell 以及為什麼要使用它?
許多技術專業人員忍受重複性任務並通過點擊方法管理事物,因為他們可以通過自動化來節省大量時間。Microsoft 的 shell 和腳本語言 PowerShell 可以提供幫助。到底什麼是 PowerShell?
在最簡單的形式中,PowerShell 是一種跨平台的 shell 和腳本語言,它允許人們從命令行管理任務並自動化數以千計的活動。它是一種建立在 Microsoft .NET Framework 之上的語言,它使我們的許多生活變得更輕鬆。
在本文中,您將了解 PowerShell、它的來源、PowerShell 基礎知識,並幫助您了解為什麼 PowerShell 可能是正確使用的工具。
什麼是 PowerShell?
PowerShell 是一種建立在Microsoft .NET 技術之上的開源 shell 和腳本語言。它旨在幫助可能不是軟件開發人員的技術專業人員構建高效的腳本和工具,以幫助他們更好地完成工作。
PowerShell 從 VBScript 和批處理文件等語言演變而來,旨在提供易於理解和使用的一流命令行界面和腳本語言。
PowerShell 是面向對象的,並且在很大程度上依賴於類似於面向對象編程 (OOP) 的對象。PowerShell 中的幾乎所有內容都是您很快就會了解的對象。
PowerShell是兩件事;它是一個命令行外殼,允許用戶在類似於舊命令提示符 (cmd.exe) 的命令行上運行命令。它也是一種強大的腳本語言,可以構建工具並自動化您能想到的任何事情。
PowerShell 可以交互運行或在腳本中運行,它提供了許多稱為 cmdlet 和函數的命令。這些命令要么是編譯的二進製文件,要么是用戶編寫的自定義代碼,用於封裝特定任務,例如讀取文件、ping 遠程計算機等。
PowerShell 的演變
2002 年,微軟的 Jeffrey Snover 意識到 Windows 不像其競爭對手 Linux 那樣具有良好的命令行界面和腳本編寫能力。為了改變這一點,Snover 發布了Monad Manifesto,一份概述了他最終將成為 PowerShell 的計劃的文件。
從 2002 年到 2005 年,PowerShell 被稱為 Monad,仍處於早期開發階段。2006 年,隨著 PowerShell 1.0 的發布,“PowerShell”一詞首次亮相。從那時起,Microsoft 的 PowerShell 團隊一直使用該宣言作為指南,不斷向 PowerShell 添加新功能。
最初僅作為Windows Management Framework的一部分提供,在 Windows XP 和 Windows Server 2012 之前,PowerShell 是單獨安裝的。但從 Windows 7 和 Windows Server 2012 R2 開始,PowerShell 已默認安裝在所有 Windows 操作系統上。
跨平台遷移
從 2006 年到 2016 年,PowerShell 僅在 Windows 上可用,最高版本為 Windows PowerShell 5.1。PowerShell 構建在 .NET Framework 之上,該框架僅在 Windows 中可用。2016 年,微軟決定大膽地在 GitHub 上開源 PowerShell,在版本 6 中放棄了“Windows”,只使用了“PowerShell”。
從那時起,PowerShell 不僅在 Windows 上可用,而且在macOS、Linux 和其他使用.NET Core的*nix 操作系統上可用。
PowerShell 的未來
截至 2021 年,PowerShell 已經見證了其最大的開發努力。為了實現 Monad Manifesto 的目標,Microsoft 的 PowerShell 團隊負責管理該產品。儘管大多數(如果不是全部)突破性功能已經發布,但微軟和開源社區仍在積極維護它。
命令
與 cmd.exe、Bash 等其他 shell 非常相似,PowerShell 具有執行某些操作的二進制命令。例如,您可以運行命令來讀取文件、ping 計算機、刪除註冊表項等等。
PowerShell 7 是最新版本,它附帶了 1500 多個稱為 cmdlet 的已編譯二進製文件。PowerShell cmdlet 無處不在,構成了可用於構建複雜腳本的工具。
與軟件開發人員使用 C# 等其他語言構建的 cmdlet 不同,普通的 Joe 可以創建自己的命令。內置 PowerShell 語言的函數允許那些了解 PowerShell 的人創建類似於 cmdlet 的命令。
開發人員使用這些 cmdlet 和函數來構建從簡單到復雜的解決方案,以自動化您能想到的任何事情。
使用Get-Commandcmdlet 發現系統上的所有可用命令。
命令語法
PowerShell 的獨特部分之一是語法。PowerShell 的語法在執行時為 IT 專業人員讀取。
與其他 shell 不同,這些命令遵循標準命名約定,準確地指明了命令的用途。
以動詞-名詞語法命名,命令名稱總是以動詞開頭,後跟破折號和名詞。
儘管 PowerShell 不要求您對自定義函數使用動詞-名詞語法,但 Microsoft 強烈鼓勵這樣做。
動詞
cmdlet 名稱中最重要的部分是動詞。此部分應準確描述 cmdlet 執行的操作。例如,在復製文件時從文件中Get-Content 獲取文本。Copy-Item您甚至可以通過Get-Verb在 PowerShell 控制台中運行命令來找到所有“已批准”的動詞,如下所示。
名詞
與動詞不同,PowerShell 沒有任何“認可”的名詞。對其採取行動的對象可以有很大的不同。但是,PowerShell 確實在引擎內部將動詞與名詞分開。您可以通過使用參數運行Get-Command命令來查看此示例。Noun
通過指定Noun參數並提供 的值A*。PowerShell 會將其所有可用命令“拆分”為動詞和名詞,並且只顯示帶有以 A 開頭的名詞的命令。
模塊
在上一節中,您看到了Get-Command命令的輸出。在該輸出中,您可以看到一個名為Source. 為了劃分命令,PowerShell 要求所有 cmdlet 都是“桶”或模塊的一部分。
模塊是基於共同功能組合的命令組。例如,許多核心 PowerShell cmdlet 位於名為Microsoft.PowerShell.Management的模塊中,而 cmdlet 則喜歡Write-Host並Write-Debug位於Microsoft.PowerShell.Utility模塊中。
PowerShell 預裝了幾十個模塊,但您也可以根據任務或產品下載數千個其他模塊。您可以找到管理其他供應商產品的模塊,甚至可以創建自己的模塊。
您可以通過運行找到安裝在您計算機上的所有模塊Get-Module -ListAvailable。該Get-Module命令查找所有已加載的模塊(導入到當前會話中)。該ListAvailable參數告訴Get-Module還搜索安裝在文件系統上但未導入的模塊。
使用該Find-Module命令搜索PowerShell 庫以發現數千個其他模塊。
對象
一旦您熟悉了 PowerShell,您需要學習的最重要的方面之一就是對象。PowerShell 中的一切都是具有屬性和方法的對象。
要了解 PowerShell,您必須首先了解對象的工作原理。
有關的:
了解 PowerShell 對象
真實世界對象
想像一個真實世界的“對象”。讓我們和貓一起工作。貓是具有各種屬性(屬性)的事物,例如顏色、大小、年齡等,這些屬性定義了貓的特徵。
每隻貓都是一個具有某些描述它的屬性的對象。這些屬性是屬性。
現在,貓不是什麼不可移動的物體。它會做一些事情,比如跑步、跳躍、眨眼或發出呼嚕聲。一隻貓(物體)執行一些動作。在 PowerShell 中,cat 對像有各種方法可以採取行動來做某事。
對像類型
使用上面的貓示例,每隻貓都是貓。但狗也是一個對象。我們現在有兩種類型的對象。在編程中,這些不同的對象稱為類型。類型是具有一組通用屬性和方法的特定對象。
貓是一種類型,狗是一種類型,汽車是一種類型。每個對像都有一組特定的屬性和可以執行的操作。
對象屬性和方法
如果可以將貓視為具有屬性和方法的對象,那麼您如何在代碼中表示呢?為了解釋這一點,讓我們首先從一種常見的對像類型開始,即字符串。
如果您在控制台中鍵入以下文本並按 Enter 鍵,它會將值返回給您,但在後台會發生更多事情。
"This is a Plain Text, and its an object"
當您按鍵盤上的 Enter 鍵時,PowerShell 會創建一個對象,特別是具有System.String類型的對象。此字符串對象具有各種“成員”,這是 PowerShell 對所有屬性和方法的術語。
您可以通過管道(稍後將詳細介紹)字符串的輸出到Get-Membercmdlet來查看分配給此字符串對象的所有成員。cmdlet 是一個方便的Get-Member命令,用於檢查 PowerShell 對象。
Length是字符串的一個屬性,指示字符串的長度。您可以使用點表示法引用屬性的值,如下所示。
"This is a Plain Text, and its an object".Length
可以看到 PowerShell 返回的值為39,說明這個腳本是 39 個字符的問題。
您將以類似的方式引用對像上的方法。但是,方法不僅需要一組字母數字字符,還需要您使用括號。
有些方法有參數。要將這些參數傳遞給方法,您需要將它們包含在括號中。
字符串對像有一個名為 的方法Upper(),它將字符串中的所有字符大寫,如下所示。
"This is a Plain Text, and its an object".ToUpper()
在 Microsoft.com 網站上閱讀有關Get-Member、屬性和方法的更多信息
PSDrives
該外殼的一個獨特功能是 PSDrive 的概念。PowerShell 驅動器或 PSDrives 是您通常習慣使用的“驅動器”,例如 C:\,但有所不同。您的典型 C:\ 是一個文件系統驅動器,由包含文件的文件夾組成。PSDrive 可以是這樣,但也可以是註冊表配置單元、Active Directory 或證書容器。
PSDrives 提供了對實際數據源的抽象,並允許您分層導航多種類型的數據。使用Get-PSDrivecmdlet 查找計算機上的所有可用驅動器。
PowerShell 有一組帶有名詞Item、ChildItem和ItemProperty. 這些 cmdlet 中的每一個都適用於任何 PSDrive。
例如,要讀取註冊表配置單元,您可以運行Get-ChildItem -Path HKLM:\或者您可能想要查找文件的屬性。為此,您將使用Get-ItemProperty -Path C:\file.txt.
錯誤處理
與所有其他編程語言一樣,PowerShell 也具有錯誤處理或異常處理支持。使用 .NET 錯誤處理(如try、catch和舊trap命令),您可以捕獲腳本中發生的異常。
不過,與其他語言不同,PowerShell 有硬終止和軟終止錯誤的概念。硬終止錯誤被認為比軟終止錯誤“更糟”。根據開發人員創建 cmdlet 的方式,cmdlet 可能會根據各種情況返回軟終止或硬終止錯誤。
例如,您可能需要在C:\NonExistingFile.txt讀取文本文件的內容,但該文件不存在。默認情況下,Get-Content如果文件不存在,則返回軟終止錯誤。軟終止錯誤不會向塊拋出異常。catch
軟終止錯誤只是將錯誤返回到控制台並退出,如下所示。
Try{
Get-Content -Path "C:\NonExistingFile.txt"
} Catch{
Write-Host "I Found An Error And Caught It.. " -ForegroundColor Yellow
}
所有 PowerShell cmdlet 都帶有一個稱為ErrorAction覆蓋默認 cmdlet 行為的參數。catch當找不到文件時,也許我希望 PowerShell 進入我的塊。為此,Get-Content需要返回異常或硬終止錯誤。
要將軟終止錯誤“轉換”為 cmdlet 引用的硬終止錯誤,請將該Stop值與ErrorAction參數一起使用,如下所示。
Try{
Get-Content -Path "C:\NonExistingFile.txt" -ErrorAction Stop
} Catch{
Write-Host "I Found An Error And Caught It.. " -ForegroundColor Yellow
}
管道
當您在任何 shell 中運行命令時,該命令可選擇返回輸出。在 Bash 和其他 shell 腳本語言中,該輸出是一個簡單的字符串。與 PowerShell 不同,該字符串不是不包含任何其他屬性的對象。
由於 PowerShell 只返回對象,它有一個管道來支持它們。管道的概念不是唯一的,但通過它傳遞對像是唯一的。
例如,也許您
Get-Process firefox
PowerShell 也有一個叫做 cmdlet 的 cmdletStop-Process可以停止運行的進程。在傳統的 shell 中,你必須做這樣的事情,佔用兩行代碼和額外的複雜性。
$process = Get-Process firefox
Stop-Process $process
但是,由於Stop-Processcmdlet 通過管道接受輸入,因此它具有了解該進程用於 Firefox 的邏輯並且可以停止該進程,如下所示。
# Find a process named Firefox and pass it to the Stop-Process command, which ends it
Get-Process firefox | Stop-Process
只要命令接受管道輸入,管道允許您將任意數量的命令串在一起。
遠程通訊
PowerShell 不僅限於安裝它的計算機。它可以很容易地在遠程計算機上運行命令。為此,它使用 PowerShell Remoting (PSRemoting)。PSRemoting 是一種連接到遠程計算機並像計算機在本地一樣執行命令的功能。
有關的:
PowerShell 遠程處理:
終極指南
例如,您可能想停止本地計算機上的 Windows Update 服務。你可以用Stop-Service -Name wuauserv.
要在遠程計算機上運行相同的命令,請將該命令“包裝”在一個腳本塊中並將該腳本塊傳遞給該Invoke-Command命令。
TEXT
Invoke-Command -ComputerName SRV -Scriptblock { Stop-Service -Name wuauserv }
PowerShell 還具有其他相關的遠程通信命令Test-Connection,例如Test-NetConnectionping、發現端口狀態和在遠程計算機上運行跟踪路由。
Test-NetConnection -ComputerName www.google.com -Port 80
結論
PowerShell 是一種出色的工具,可幫助 IT 專業人員、系統管理員、開發人員或其他任何人管理計算機系統。它是一個工具,應該通過其基礎命令與社區模塊以及創建自己的腳本的能力成為每個人的工具帶。
要了解更多信息,請在此處查看其他人在 PowerShell 上的帖子並開始自動化!