(3)Powershell基礎知識(一)

Powershell的基礎知識,包含以下知識點

  1. Powershell的一些特性
  2. 理解Powershell中的一些重要概念
  3. 理解Powershell中命令的命名規範
  4. 總結

Powershell的一些特性

Powershell對命令行和腳本環境添加了許多新的功能,以此來改善Powershell的管理和腳本腳本交互能力,想對於其他的命令腳本,Powershell有以下特性。

  • 可發現特性 可發現特性是指,Powershell可以輕鬆發現(找出)與執行具體操作有關的命令。比如現在想對Window服務,即對service進行操作(停止或是啟動服務等其它操作),可以通過以下命令來查找與操作service有關的命令。    
PS C:Documents and SettingsAdministrator> Get-Command *service    CommandType     Name                                                Definition  -----------     ----                                                ----------  Cmdlet          Get-Service                                         Get-Service [[-Name] <String[]>] [-ComputerName ...  Cmdlet          New-Service                                         New-Service [-Name] <String> [-BinaryPathName] <...  Cmdlet          Restart-Service                                     Restart-Service [-Name] <String[]> [-Force] [-Pa...  Cmdlet          Resume-Service                                      Resume-Service [-Name] <String[]> [-PassThru] [-...  Cmdlet          Set-Service                                         Set-Service [-Name] <String> [-ComputerName <Str...  Cmdlet          Start-Service                                       Start-Service [-Name] <String[]> [-PassThru] [-I...  Cmdlet          Stop-Service                                        Stop-Service [-Name] <String[]> [-Force] [-PassT...  Cmdlet          Suspend-Service                                     Suspend-Service [-Name] <String[]> [-PassThru] [...

    從輸出結果中,可以看到可以獲取指定的service,新建新的service,重啟,設置service的一些狀態,啟動,停止等操作。注意在Definition列,內容並沒有完全顯示,可以後面會講到如何調節其輸出格式。

    通過Powershell的發現特性,找到具體的命令之後,就可以通過Get-Help cmdlet 了解有關該mdlet 的詳細信息。例如,要顯示有關 Get-Service cmdlet 的幫助,在命令行輸入以下命令。

Get-Help Get-Service

    如果要查看該輸出結果的成員信息,比如該輸出結果有哪些成員,方法,返回類型等,可以通過管道運算符(|)將其執行結果傳遞給Get-Member,如輸入以下命令可以查看Get-Service輸出對象的成員信息(以下是部分輸出信息)。

PS C:Documents and SettingsAdministrator> Get-Service | Get-Member         TypeName: System.ServiceProcess.ServiceController    Name                      MemberType    Definition  ----                      ----------    ----------  Name                      AliasProperty Name = ServiceName  RequiredServices          AliasProperty RequiredServices = ServicesDependedOn  Disposed                  Event         System.EventHandler Disposed(System.Object, System.EventArgs)  Close                     Method        System.Void Close()  Continue                  Method        System.Void Continue()  CreateObjRef              Method        System.Runtime.Remoting.ObjRef CreateObjRef(type requestedType)

其中MemberType列是成員信息的屬性,是屬性,事件,還是方法等。

  • 一致性

    一致性是Powershell主要優點之一,同一的接口降低了管理任務的複雜性。例如如果你學會了獲取Get-Servce的幫助信息,那麼就學會了查看所有命令的幫助信息。

  • 交互式腳本環境 PowerShell 將交互式環境和腳本環境組合在一起,從而允許訪問命令行工具和 COM 對象,同時還可利用 .NET Framework 類庫 (FCL) 的強大功能(可以加載調用cmd,exe,dll外部,在企業級實戰部分會介紹到)。Powershell對命令提示符進行了改進,提供了帶有多種命令的交互式環境。PowerShell 擴展了交互用戶和腳本編寫者的能力,從而更易於進行相關作業腳本的開發,系統管理。
  • 面向對象 雖然可以通過以文本方式鍵入命令與 PowerShell 進行交互,但 Windows PowerShell是基於對象的,而不是基於文本的。意味着Powershell命令的輸出即為對象。可以將輸出對象發送給另一條命令以作為其輸入(通過管道運算符"|")。因此,Windows PowerShell 為曾使用過其他 shell的人員提供了熟悉的界面,同時引入了新的、功能強大的命令行範例。通過允許發送對象(而不是文本),它擴展了在命令之間發送數據的概念。
  • 右命令行很容易過度到腳本 使用 Windows PowerShell,可以很方便地從以交互方式鍵入命令過渡到創建和運行腳本。可以在 Windows PowerShell命令提示符下鍵入命令以找到可執行任務的命令。隨後,可將這些命令保存到腳本或歷史記錄中,然後將其複製到文件中以用作腳本。

理解Powershell中的一些重要概念

在開始Powershell的實際開發之前,理解以下概念非常有助於了解Powershell設計思想。

  • 命令不是基於文本的,是基於.Net對象的 與傳統的命令(如perl,bat,cmd,bash等)不同,Powershell可處理對象(結構化的信息),而不只是顯示在屏幕上的字符串,命令輸出始終提供可能會需要的額外信息,通過標準的Powershell對象操作命令,即可操作命令返回數據的任何部分。
  • 命令系列是可擴展的 許多接口(例如 Cmd.exe)均不能提供直接擴展內置命令集的方法。可以創建在 Cmd.exe 中運行的外部命令行工具,但這些外部工具不能提供服務(例如幫助集成),而且 Cmd.exe 不能自動識別它們是否是有效的命令。 PowerShell 中的本機二進制命令cmdlet可以通過創建並使用管理單元添加到 Windows PowerShell 中的 cmdlet 進行補充。與任何其他接口中的二進制工具相同,Windows PowerShell 管理單元已經過編譯。可以使用它們將 Windows PowerShell 提供程序以及新的 cmdlet 添加到 shell 中。最重要的是,Powershell能夠識別這些新添加的命令是否是有效的命令。 除此之外,Powershell還可以調用外部的.ps1腳本文件,也可以在腳本中創建自己的函數。
  • Windows Powershell處理控制台輸入和顯示 輸入命令時,PowerShell 始終會直接處理命令行輸入。PowerShell 還可以設置屏幕上顯示的輸出格式。這個功能十分重要,因為它可以減少處理每個命令所需的工作,並確保在使用任何一種 cmdlet 時都能始終以相同方式進行操作。這樣可以簡化腳本工具開發人員和使用者的工作。 舉個例子,對於請求和顯示幫助,傳統的命令行工具都有它們自己的方案。一些命令行工具使用 /? 來觸發幫助顯示,而其他一些命令行工具則使用 -?/H 甚至 //。其中一些工具會在 GUI 窗口中顯示幫助,而不以控制台顯示。某些複雜工具(例如應用程序更新程序)會先將內部文件解包,然後才顯示其幫助。如果使用的參數不正確,則該工具可能會忽略鍵入的內容,並自動開始執行任務。 但在 PowerShell 中輸入命令時,它會自動分析並預處理所輸入的全部內容。如果在 PowerShell cmdlet 中使用 -? 參數,則始終表示「顯示此命令的幫助」。腳本命令開發人員無需分析該命令,他們只需提供幫助文本。即使是在 PowerShell 中運行傳統命令行工具,也可以使用 PowerShell 的幫助功能。PowerShell 將對參數進行處理並將結果傳遞給外部工具。
  • Windows Powershell使用某些C#語法 由於 PowerShell 基於 .NET Framework,因此 PowerShell 的語法功能和關鍵字與 C# 編程語言中所使用的語法功能和關鍵字十分類似。換句話說,學習C#和Powershell是相互促進的,如果您不是 C# 程序員或是完全不了解C#,也沒有關係,了解任何一門面對對象的編程語言都有助於學習Powershell。如果已經熟悉 C#,則這些相似性可以幫助你更輕鬆地了解PowerShell。

理解Powershell中命令的命名規範

使用大多數命令行界面時,通常會遇到以下問題。

  • 了解命令名稱及命令參數需要花費大量的時間。 使用新命令或參數時,通常無法使用已知的名稱,而必須查找和了解新的名稱。考慮到界面是如何從一個小工具集經過不斷添加的新增功能發展而來,就很容易了解為何其結構會是非標準的。尤其是使用命令名稱時,這一點可能是必然的,因為每種命令都是單獨的工具。
  • 命令沒有統一的模式,因此只能通過記住常用的每種命令和每個參數來了解這些命令行界面。 大多數命令都是為管理操作系統或應用程序的元素(如服務或進程)構建的。這些命令有不同的名稱,它們可能屬於或不屬於一個系列。例如,在 Windows 系統上可以使用 net startnet stop 命令來啟動和停止服務。另外還有一個名為 sc 的更通用的 Windows 服務控制工具,這一完全不同的名稱與 net 服務命令的命名模式不一致。對於進程管理,Windows 使用 tasklist 命令來列出進程,並使用 taskkill 命令來終止進程。 但是不能使用 net start 命令來啟動遠程計算機上的服務sc 命令可以啟動遠程計算機上的服務,但是,若要操作遠程計算機上的服務,必須在其名稱前添加雙反斜杠作為前綴。例如,若要在名為 PC01 的遠程計算機上啟動後台打印程序服務,您可以鍵入 sc \PC01 start spooler。若要列出在 PC01 上運行的任務,需要使用 /S(代表「system」)參數,並提供如下所示的不帶反斜杠的名稱 PC01:tasklist /S PC01。 儘管服務與進程之間有很大的技術差別,但它們都是計算機上具有定義完整的生命周期的可管理元素示例。可能需要啟動或停止服務或進程,或獲得所有當前正在運行的服務或進程的列表。換而言之,儘管服務和進程並不相同,但從概念上來看,對服務或進程執行的操作通常是相同的。PowerShell 通過統一的模式(類似的命令)來減少要了解和使用 cmdlet 所需知道的不同名稱數。

Powershell命令集cmdlet通過使用"動詞-名詞"名稱以減少命令記憶量。

    PowerShell 使用"動詞-名詞"命名系統,其中的每個 cmdlet 名稱均由標準動詞、連字符和特定名詞組成。PowerShell 動詞並非一定為英語動詞,但其表示 Windows PowerShell 中的特定操作。名詞與所有語言中的名詞十分類似,名詞所受的限制較少,但它們應始終描述命令的操作對象。

    舉幾個動詞和名詞的示例,來說明他們是如何減少您了解命令所需的記憶量。PowerShell 具有 Get-ProcessStop-ProcessGet-ServiceStop-Service 等命令。

如果僅有兩個名詞和兩個動詞,則一致性並不會極大地簡化您了解這些命令的過程。但是,假定是由 10 個動詞和 10 個名詞組成的一組標準命令名稱,則您只需記住 20 個單詞,而使用這些單詞可以構成 100 個不同的命令名稱。

    通常,只需通過命令的名稱即可識別其用途,而對新命令應使用什麼樣的名稱,這通常也是顯而易見的。例如,計算機關閉命令可能為 Stop-Computer。用於列出網絡上的所有計算機的命令可能為 Get-Computer。用於獲取系統日期的命令為 Get-Date

Get-Command 中使用 -Verb 參數可以列出所有包含特定動詞的命令(在後面的文章中會詳細介紹 Get-Command)。例如,若要查看所有使用動詞 Get 的 cmdlet,輸入:

PS C:Documents and SettingsAdministrator> Get-Command -Verb Get    CommandType     Name                                                Definition  -----------     ----                                                ----------  Cmdlet          Get-Acl                                             Get-Acl [[-Path] <String[]>] [-Audit] [-Filter <...  Cmdlet          Get-Alias                                           Get-Alias [[-Name] <String[]>] [-Exclude <String...  Cmdlet          Get-AuthenticodeSignature                           Get-AuthenticodeSignature [-FilePath] <String[]>...  Cmdlet          Get-ChildItem                                       Get-ChildItem [[-Path] <String[]>] [[-Filter] <S...  Cmdlet          Get-Command                                         Get-Command [[-ArgumentList] <Object[]>] [-Verb ...  Cmdlet          Get-ComputerRestorePoint                            Get-ComputerRestorePoint [[-RestorePoint] <Int32...  Cmdlet          Get-Content                                         Get-Content [-Path] <String[]> [-ReadCount <Int6...  ...

-Noun 參數用處更大,因為使用該參數可以查看影響同一對象類型的所有命令。例如,若要顯示可用於管理服務的命令,請輸入以下命令

PS C:Documents and SettingsAdministrator> Get-Command -Noun Service    CommandType     Name                                                Definition  -----------     ----                                                ----------  Cmdlet          Get-Service                                         Get-Service [[-Name] <String[]>] [-ComputerName ...  Cmdlet          New-Service                                         New-Service [-Name] <String> [-BinaryPathName] <...  Cmdlet          Restart-Service                                     Restart-Service [-Name] <String[]> [-Force] [-Pa...  Cmdlet          Resume-Service                                      Resume-Service [-Name] <String[]> [-PassThru] [-...  Cmdlet          Set-Service                                         Set-Service [-Name] <String> [-ComputerName <Str...  Cmdlet          Start-Service                                       Start-Service [-Name] <String[]> [-PassThru] [-I...  Cmdlet          Stop-Service                                        Stop-Service [-Name] <String[]> [-Force] [-PassT...  Cmdlet          Suspend-Service                                     Suspend-Service [-Name] <String[]> [-PassThru] [...

總結

通過學習本節內容,應當掌握以下內容

  1. Powershell中的可發現,一致性,面向對象等特性
  2. Powershell是基於.Net對象,而不是基於文本的。
  3. Powershell中"動詞-名詞"的命名規範。