1. 程式人生 > 其它 >PowerShell初探(一)

PowerShell初探(一)

PowerShell 是一種跨平臺的任務自動化解決方案,由命令列 shell、指令碼語言和配置管理框架組成。 作為一種指令碼語言,PowerShell 通常用於自動執行系統管理。 它還用於經常在 CI/CD 環境中生成、測試和部署解決方案。

PowerShell初探(一)

摘抄自:https://docs.microsoft.com/zh-cn/powershell/scripting/overview?view=powershell-7.2

概述

PowerShell 是一種跨平臺的任務自動化解決方案,由命令列 shell、指令碼語言和配置管理框架組成。

作為一種指令碼語言,PowerShell 通常用於自動執行系統管理。 它還用於經常在 CI/CD 環境中生成、測試和部署解決方案。

如何啟動 PowerShell?

  1. 單擊“Windows PowerShell”快捷方式啟動了 PowerShell 控制檯;
  2. 右擊“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.

此時,它是一個指令碼模組。我們可以看到它包含了哪些命令: