指令碼簡介
PowerShell 指令碼處理是以 PowerShell 語言撰寫一組陳述式,並將這些陳述式儲存在文字檔中。 為什麼要這麼做? 使用 PowerShell 一段時間之後,您會發現自己重複某些工作,例如產生記錄報告或管理使用者。 當您經常重複某些內容時,將它自動化可能是個好主意:以這種方式儲存它,使其易於重複使用。
自動執行工作的步驟通常包括對 Cmdlet、函式、變數等的呼叫。 若要儲存這些步驟,您可以建立以 .ps1結尾的 檔案並加以儲存。 接著,您可以執行腳本。
開始學習指令碼之前,讓我們先來瞭解 PowerShell 指令碼語言功能的概觀:
變數。 您可以使用變數來儲存值。 您也可以使用變數作為命令的引數。
函數。 函式是陳述式的具名清單。 函數會產生顯示在主控台中的輸出。 您也可以使用函數作為其他命令的輸入。
備註
您會用於 PowerShell 的許多工作,都是關於系統狀態 (本地或非本地) 的副作用或修改。 輸出通常是次要考慮 (例如,報告資料)。
流量控制。 流量控制是您如何透過使用
If、ElseIf和Else等建構來控制各種執行路徑。迴圈。 迴圈是一種建構,可讓您在陣列上作業、檢查每個項目,以及對每個項目執行某種作業。 但迴圈不僅限於陣列疊代。 您也可以使用
Do-While迴圈,有條件地繼續執行迴圈。 如需詳細資訊,請參閱關於。錯誤處理。 撰寫出強大的指令碼,並可處理各種類型的錯誤很重要。 您必須知道終止和非終止錯誤之間的差異。 您使用像
Try和Catch這樣的結構。 我們將在本課程模組的最後一個概念單元中討論本主題。運算式。 您經常在PowerShell腳本中使用表示式。 例如,建立自訂資料行或自訂排序運算式。 運算式是 PowerShell 語法中值的表示法。
.NET 和 .NET 核心整合。 PowerShell 提供與 .NET 和 .NET Core 的強大整合。 該整合已超出本課程模組的範圍。
執行指令碼
您必須注意一些指令碼並不安全。 如果您在網際網路上找到指令碼,除非您完全瞭解其功用,否則您不應該在電腦上執行。 即使有您認為安全的指令碼,也可能會有風險。 例如,想像一下在測試環境中清除項目的指令碼。 該指令碼在實際執行環境中可能會有危害。 不論指令碼您是或同事撰寫,還是您從網際網路取得的,您都必須了解指令碼的功能。
PowerShell 主要會以兩種方式,嘗試防止您在無意間執行作業。
- 需要使用完整路徑或相對路徑來執行指令碼。 當您執行指令碼時,一律需要提供指令碼的路徑。 提供路徑可協助您確切瞭解您正在執行的內容。 例如,您的電腦上可能會有不想要執行、但名稱與指令碼相同的命令和別名。 包含路徑可提供額外的檢查,以確保您確實執行所要執行的工作。
- 執行原則。 執行原則是一項安全性功能。 如同需要指令碼的路徑,原則可能會阻止您執行非預期的動作。 您可以在各種層級上設定原則,例如本機電腦、目前的使用者或特定的工作階段。 您也可以使用群組原則設定來設定電腦和使用者的執行原則。
這兩種機制不會阻止您開啟檔案、複製其內容、將內容放在文字檔中,以及執行檔案。 其也不會阻止您透過主控台執行程式碼。 這些機制有助於防止您做出無意的行為。 其並不是安全性系統。
若要建立並執行指令碼:
建立如下所示的一些 PowerShell 陳述式,然後將其儲存在結尾為「ps1」的檔案中:
# PI.ps1 $PI = 3.14 Write-Host "The value of `$PI is $PI"藉由叫用指令碼的名稱和路徑來執行指令碼:
備註
執行指令碼之前,請確定目前的 shell 是 PowerShell。 或者,在 Linux 或 macOS 上,您可以將 shebang 放在腳本檔案的頂端,以指定 PowerShell 作為腳本的執行解譯器。
./PI.ps1我們建議您在叫用過程中包含副檔名,但此並非必要的操作。
執行原則
您可以使用下列 Cmdlet 來管理執行原則:
Get-ExecutionPolicy。 此 Cmdlet 會傳回目前的執行原則。 在 Linux 和 macOS 上,傳回的值為Unrestricted。 針對這些作業系統,您無法變更此值。 這項限制不會讓 Linux 或 Mac 不安全。 請記住,執行原則是一種安全性功能,而不是安全性機制。Set-ExecutionPolicy。 如果您使用 Windows 電腦,您可以使用這個 Cmdlet 來變更執行原則的值。 其需要-ExecutionPolicy參數。 有一些可能的值。 最好是使用Default做為值。 該值會在 Windows 用戶端上將原則設定為Restricted並在 Windows Server 上將原則設為RemoteSigned。Restricted表示您無法執行指令碼。 您只能執行在用戶端上有意義的命令。RemoteSigned表示在本機電腦上撰寫的指令碼可以執行。 從網際網路下載的指令碼,必須由信任的發行者的數位簽章進行簽署。備註
有一些其他您可以使用的值。 若要深入瞭解,請參閱關於執行原則。
變數
變數不只適用於指令碼。 您也可以在主控台上定義。 您可以將值儲存在變數中,以便稍後使用。 若要定義變數,請在其前面加上 $ 字元。 以下是範例:
$PI = 3.14
使用變數:引號和內插補點
當您透過 Write-Host 或 Write-Output 輸出文字時,可以使用單引號或雙引號。 您所做的選擇取決於您是否想要插入值。 有三個您應該了解的機制:
單引號。 單引號用於指定字面值,您寫下什麼就得到什麼。 以下是範例:
Write-Host 'Here is $PI' # Prints Here is $PI如果您想要進行「插入」,以便轉譯並列印
$PI的值,就必須使用雙引號。雙引號。 當您使用雙引號時,會將字串中的變數插入:
Write-Host "Here is `$PI and its value is $PI" # Prints Here is $PI and its value is 3.14這裡有兩件事要做。 行接續符號 (`) 可讓您逸出
$PI第一個執行個體的內插補點。 在第二個執行個體中,會將值插入並寫出。$()。 您也可以在雙引號內撰寫表達式。 若要這麼做,請使用$()建構。 使用這個建構的其中一種方式,是插入物件的屬性。 以下是範例:Write-Host "An expression $($PI + 1)" # Prints An expression 4.14
Scope
範圍是指 PowerShell 如何定義可以讀取和變更變數、別名和函式等建構的位置。 當您想要撰寫指令碼時,您需要知道您有權存取的內容、可以變更的內容,以及可以變更的位置。 如果您不了解範圍的運作方式,您的程式碼可能無法如預期般運作。
範圍類型
讓我們來討論各種範圍:
全域範圍。 當您在此範圍中建立如變數的建構時,其會在您的工作階段結束後繼續存在。 當您啟動新的 PowerShell 工作階段時,任何存在於此範圍的事項都可以被認為屬於該範圍。
指令碼範圍。 當您執行指令檔時,會建立指令碼範圍。 例如,在檔案中定義的變數或函式是在指令碼範圍中。 檔案完成執行後將不再存在。 例如,您可以在指令碼檔案中建立變數,並將目標設為全域範圍。 但是,您必須在變數前面加上關鍵字
global,以明確定義該範圍。區域範圍。 目前的範圍是本地範圍,但可以是全域範圍或任何其他範圍。
範圍規則
範圍規則可協助您瞭解在指定點可見的值。 其也可協助您瞭解如何變更值。
範圍可以巢狀處理。 範圍可以有父範圍。 父範圍是位於您所在範圍之外的外部範圍。 例如,區域範圍可以有全域範圍作為父範圍。 相反地,範圍可以有巢狀範圍,也稱為「子範圍」。
項目會顯示在目前的和子範圍中。 變數或函式之類的項目會顯示在建立項目的範圍內。 根據預設,其也會顯示在任何子範圍中。 如果想要變更這樣的行為,可以讓項目在範圍內成為私人 (如此該項目就會隱藏起來)。 這是在主控台中使用定義變數的範例:
$test = 'hi'如果您有包含下列內容的 Script.ps1 檔案,它會在文稿執行時列印 「hi」 :
Write-Host $test # Prints hi您可以看到變數
$test在區域範圍和其子範圍中都是可見的,而在此案例中為指令碼範圍。項目只能在建立的範圍內變更。 根據預設,您只能在建立項目的範圍內變更項目。 您可以藉由明確指定不同的範圍來變更此行為。
個人資料
設定檔是在 PowerShell 啟動時執行的指令碼。 您可以使用設定檔來自訂您的環境,例如變更背景色彩和錯誤,以及進行其他類型的自訂。 PowerShell 會將這些變更套用至您啟動的每個新工作階段。
設定檔類型
PowerShell 支援數個設定檔。 您可以在各種層級套用,如下所示:
| 描述 | 路徑 |
|---|---|
| 所有使用者、所有主機 | $PSHOME\Profile.ps1 |
| 所有使用者、目前主機 | $PSHOME\Microsoft.PowerShell_profile.ps1 |
| 目前使用者、所有主機 | $Home[我的]文件夾\PowerShell\Profile.ps1 |
| 目前使用者、目前主機 | $Home[我的]文件\PowerShell\Microsoft.PowerShell_profile.ps1 |
這裡有兩個變數:$PSHOME 和 $Home。
$PSHOME 指向 PowerShell 的安裝目錄。
$Home 是目前使用者的主目錄。
其他程式也支援設定檔,例如 Visual Studio Code。
建立個人資料
當您第一次安裝PowerShell時,沒有配置檔,但有變數 $Profile 。 這是一個物件,指向要套用每個設定檔的路徑。 建立設定檔:
決定您要建立設定檔的層級。 您可以執行
$Profile | Select-Object *來查看設定檔類型和與其相關聯的路徑。選取設定檔類型,並透過使用類似下列的命令:
New-Item -Path $Profile.CurrentUserCurrentHost,在其位置建立文字檔。將您的自訂新增至文字檔,並加以儲存。 下次當您啟動工作階段時,將會套用您的變更。