有關(guān)PowerShell腳本你必須知道的十個(gè)基本概念
原創(chuàng)【51CTO精選譯文】PowerShell腳本提供了一個(gè)方便的方法來自動化各種瑣事。下面是關(guān)于PowerShell的一些基本概念,對于PowerShell初學(xué)者,掌握這些概念有助于加深對PowerShell腳本的理解。
51CTO推薦專題:Windows中的腳本技術(shù)-Windows Powershell
1、PS1文件
一個(gè)PowerShell腳本其實(shí)就是一個(gè)簡單的文本文件,這個(gè)文件包含了一系列PowerShell命令,每個(gè)命令顯示為獨(dú)立的一行,對于被視為PowerShell腳本的文本文件,它的文件名需要使用.PS1擴(kuò)展。
2、執(zhí)行權(quán)限
為防止惡意腳本的執(zhí)行,PowerShell有一個(gè)執(zhí)行策略,默認(rèn)情況下,這個(gè)執(zhí)行策略被設(shè)為受限的(Restricted),意味著PowerShell腳本無法執(zhí)行,你可以使用下面的cmdlet命令確定當(dāng)前的執(zhí)行策略:
Get-ExecutionPolicy
你可以選擇使用的執(zhí)行策略有:
- Restricted - 腳本不能運(yùn)行。
- RemoteSigned - 本地創(chuàng)建的腳本可以運(yùn)行,但從網(wǎng)上下載的腳本不能運(yùn)行(除非它們擁有由受信任的發(fā)布者簽署的數(shù)字簽名)。
- AllSigned – 僅當(dāng)腳本由受信任的發(fā)布者簽名才能運(yùn)行。
- Unrestricted – 腳本執(zhí)行不受限制,不管來自哪里,也不管它們是否有簽名。
你可以使用下面的cmdlet命令設(shè)置PowerShell的執(zhí)行策略:
Set-ExecutionPolicy <policy name>
3、運(yùn)行腳本
如果你想從命令行運(yùn)行一個(gè)可執(zhí)行文件,多年來一個(gè)永恒不變的方法是,在命令行轉(zhuǎn)到該執(zhí)行文件所在的位置,然后鍵入該執(zhí)行文件的名稱,但這個(gè)古老的方法現(xiàn)在卻不能適用于PowerShell可執(zhí)行腳本了。
如果你想執(zhí)行一個(gè)PowerShell腳本,通常必須鍵入完整的路徑和文件名,例如,假設(shè)你要運(yùn)行一個(gè)名為SCRIPT.PS1的腳本,你可以鍵入:
C:\Scripts\Script.ps1
***的例外是,如果PowerShell腳本文件剛好位于你的系統(tǒng)目錄中,那么你可以直接在命令提示符后鍵入腳本文件名即可運(yùn)行,如:
.\Script.ps1
注意前面需要加上.\,這和Linux下執(zhí)行Shell腳本的方法如出一轍。
4、管道
管道的作用是將一個(gè)命令的輸出作為另一個(gè)命令的輸入,兩個(gè)命令(或cmdlet)之間只需要用管道符號(|)連接即可。
為了幫助你了解管道是如何工作的,我們以一個(gè)例子進(jìn)行說明,假設(shè)你想創(chuàng)建運(yùn)行在服務(wù)器上的進(jìn)程列表,并按進(jìn)程的ID號進(jìn)行排序,可以使用Get-Process cmdlet命令獲得進(jìn)程列表,但默認(rèn)情況下列表不會排序,如果將這個(gè)cmdlet命令的輸出用管道輸送給Sort-Object ID命令,進(jìn)程列表將會按進(jìn)程ID號進(jìn)行排序,如:
Get-Process | Sort-Object ID
5、變量
雖然可以使用管道將一個(gè)命令的輸出輸送給另一個(gè)命令,但管道本身也是有限制的,當(dāng)你用管道從一個(gè)命令向另一個(gè)命令傳遞輸出結(jié)果時(shí),輸出結(jié)果立即被使用,但有時(shí)候,你可能需要保存輸出結(jié)果一段時(shí)間,以便以后可以使用(或重用),這個(gè)時(shí)候管道就應(yīng)該下場,輪到變量上場了。
人們很容易將變量想象成一個(gè)倉庫,但在PowerShell中,變量可以保存命令的完整輸出,例如,假設(shè)你想保存服務(wù)器處于運(yùn)行中的進(jìn)程列表,你可以將它賦給一個(gè)變量,如:
$a = Get-Process
在這里,變量被命名為$a,如果你想使用這個(gè)變量,只需要簡單地調(diào)用它的名稱即可,例如,鍵入$a便可在屏幕上打印變量的內(nèi)容。
你可以將多個(gè)用管道連接的命令的最終輸出賦給一個(gè)變量,只需要用一對小括號將命令括起來即可,例如,假設(shè)你想按進(jìn)程ID對運(yùn)行中的進(jìn)程進(jìn)行排序,然后將結(jié)果輸出給一個(gè)變量,你可以使用下面這個(gè)命令:
$a = (Get-Process | Sort-Object ID)
6、@符號
通過使用@符號,你可以將列表內(nèi)容轉(zhuǎn)換成一個(gè)數(shù)組,例如,下面的代碼創(chuàng)建了一個(gè)名為$Procs的變量,它包含多行文本內(nèi)容(一個(gè)數(shù)組):
$procs = @{name="explorer","svchost"}
使用變量時(shí)你也可以使用@符號,為了確保它作為數(shù)組而不是單個(gè)值處理,例如,下面的代碼將在我前面定義的變量上運(yùn)行Get-Process cmdlet命令:
Get-Process @procs
Windows將顯示W(wǎng)indows資源管理器和Svchost使用的所有進(jìn)程,注意變量前使用的@符號,而不是常見的$符號。
7、Split
Split操作符根據(jù)你指定的字符拆分一個(gè)文本字符串,例如,假設(shè)你想將一個(gè)句子拆分成一個(gè)單詞組成的一個(gè)數(shù)組,你可以使用下面的命令做到:
"This is a test" -split " "
拆分后的結(jié)果如下:
This is a test
8、Join
就像Split可以將一個(gè)文本字符串拆分成多塊一樣,Join的操作則是逆向的,將多個(gè)獨(dú)立的塊連接成一個(gè)整體,例如,下面這行代碼將會創(chuàng)建一個(gè)文本字符串,由我的名字和姓氏組成:
"Brien","Posey" -join " "
命令末尾雙引號之間的空格告訴Windows在兩個(gè)文本字符串之間插入一個(gè)空格。
9、斷點(diǎn)
運(yùn)行一個(gè)新創(chuàng)建的PowerShell腳本時(shí),如果腳本有Bug,會遇到意想不到的后果,保護(hù)自己的一個(gè)方法是在腳本的關(guān)鍵位置插入斷點(diǎn),這樣你就可以確保腳本正常運(yùn)行先,然后再處理可能存在的問題。
插入斷點(diǎn)最簡單的方法是根據(jù)行號插入,例如,假設(shè)你要在第10行插入一個(gè)斷點(diǎn),可以使用下面的命令:
New-PSBreakpoint -Script C:\Scripts\Script.ps1 -Line 10
你也可以將斷點(diǎn)綁定到變量上,如果你希望你的腳本任何時(shí)候都可以修改a$的內(nèi)容,可以使用下面的命令:
New-PSBreakpoint -Script C:\scripts\Script.ps1 -variables a
注意,我在變量名后并沒有包括美元符號。
可以和PSBreakpoint一起使用的動詞包括New,Get,Enable,Disable和Remove。
10、Step
調(diào)試一個(gè)腳本時(shí),有時(shí)可能需要逐行運(yùn)行腳本,這時(shí)你可以使用Step-Into cmdlet命令,它會使腳本一行一行地執(zhí)行,不管有沒有設(shè)置斷點(diǎn),如果你想從這種步進(jìn)式運(yùn)行模式退出來,使用Step-Out cmdlet命令即可,但需要注意的是,使用Step-Out cmdlet命令后,斷點(diǎn)仍然有效。
順便說一句,如果你的腳本使用了函數(shù),你可能對Step-Out cmdlet更感興趣,Step-Out的工作方式和Step-Into一樣,不過,如果調(diào)用了一個(gè)函數(shù),Windows不會逐步執(zhí)行,整個(gè)函數(shù)將會一次性執(zhí)行。
【51CTO.com譯文,轉(zhuǎn)載請注明原文作譯者和出處?!?/p>
原文:10 fundamental concepts for PowerShell scripting
【編輯推薦】