PowerShell基礎知識

 powershell 中文技術網

 

如果要學一門語言, 你就必須對語言的語法, 特性有所瞭解. 只要對語言的各個環境瞭解, 才能更好編寫, 調式, 部署你的程序. 因此, 教程第二部分將會着重於如下幾個方面:


1. PowerShell, Shell, 腳本語言等概念;
2. 參數綁定;
3. 類型轉換.

這些基礎知識, 希望大家不要輕視, 因爲後面的教程將會直接引用這些概念.

首先, 我們先來調查PowerShell中最重要的元素: 命令(Command). 在PowerShell中, 命令分爲四類: cmdlet, function, script和native Windows commands. 可能看到這四個英文名稱會有些頭大, 我們來仔細瞭解一下.

1. cmdlet
在PowerShell官方blog上, 有篇關於Cmdlets和API的介紹. 因爲PowerShell建立在.Net上, 再加上COM, WMI, ADO, XML等技術. 使得PowerShell對於.Net應用開發人員,服務器管理人員來說都會非常方便, 通過這些已有的接口, 即可完成大量的任務. 但是, PowerShell的設計者明確的指出Cmdlets是PowerShell的靈魂.
Cmdlet是Command-Let的縮寫. cmdlet這類命令有一種統一的命名方法: Verb-Noun, 也就是 動詞-名詞. 如果你是一名.Net程序員, 那麼編程規範中應該也會提出, 對於方法(method)的命名, 最好使用動詞-名詞形式配合駱駝(Camel)命名法.
查看有哪些cmdlet參考如下:

PS C:\> get-command -CommandType cmdlet

CommandType Name Definition

----------- ---- ----------

Cmdlet Add-Content Add-Content [-Path] <String[]> [-Value] <Object[...

Cmdlet Add-History Add-History [[-InputObject] <PSObject[]>] [-Pass...

Cmdlet Add-Member Add-Member [-MemberType] <PSMemberTypes> [-Name]...

Cmdlet Add-PSSnapin Add-PSSnapin [-Name] <String[]> [-PassThru] [-Ve...

Cmdlet Clear-Content Clear-Content [-Path] <String[]> [-Filter <Strin...

Cmdlet Clear-Item Clear-Item [-Path] <String[]> [-Force] [-Filter ...

Cmdlet Clear-ItemProperty Clear-ItemProperty [-Path] <String[]> [-Name] <S...


這裏我省略了絕大部分的顯示(^^), PowerShell Version 1.0 微軟官方發佈的版本包含了

PS C:\> (get-command -CommandType cmdlet).count

129


129確實有點多, 但是實際上在學習過程中你會發現學習他們的過程比你學習unix shell中命令更加容易些, 原因稍後爲你解答.

cmdlet是可以進行擴展的, 如果你想開發自己的cmdlet, 你需要下載PowerShell SDK. 目前, 我只知道該 SDK 包含在了Windows Vista Platform. SDK中. 下載該 SDK, 需要進行正版驗證. 在伴隨着教程的編寫過程, 我也會閱讀PowerShell SDK中關於PowerShell的介紹, 並儘量用最簡單的語言將需要注意的內容, 傳達給大家.

cmdlet的開發並不複雜, 可以使用C#作爲實現語言, PowerShell SDK已經實現了好了cmdlet的一個基類, 開發的cmdlet只需要繼承該基類. 通過這種開發模式, 最大的優點:

  (1). 所有的cmdlet中包含了一些公共參數(common parameters), 例如: -Verbose, -Debug, -ErrorAction, -ErrorVariable, and -OutVariable. 這些參數大多用於一些腳本調試等.

  (2). 所有的cmdlet中的參數(parameters)具有相似的參數, 相同的類型, 甚至具有相同的性質. 對於接受輸入的某些cmdlet來說, 輸入的參數就叫做-InputObject, 參數類型一般是[object[]], 而通常都會具有從管道線讀取處理對象的屬性.

這種一致性帶來的最大好處就是, 對於一個命令, 往往你只需要關注命令的特性, 不需要記住複雜繁多的參數. 如果你熟悉unix shell下的utils core tools那麼我相信, 例如awk使用-F指定一個支持正則表達式的與分隔符, cut使用-d來分割, sort使用-t進行分割對你來說是痛苦的. 在PowerShell中, 你甚至不需要對cmdlet產生的輸出進行分割. 這點你會在稍後看到.

cmdlet編譯後的結果不是可執行文件, 而是dll文件, PowerShell啓動時, 將這些命令加載, 這些命令執行效率最高, 因爲他們在PowerShell時被載入PowerShell進程內.

2. 函數(function)

函數, 準確的說就是: 有名稱的代碼塊(scriptblock). 下面就是一個簡單的函數定義:

PS C:\> function Get-DayToBeiJingOlympic

>> {

>> ([datetime] "2008-08-08" - [datetime]::Now).Days;

>> }

>>

PS C:\> Get-DayToBeiJingOlympic

370


細節大家可以不用關心, 稍後都會講到. 函數就是一段你輸入到PowerShell的命令集合.

但是函數在被定義後, 才存在於PowerShell內存中, 當PowerShell退出時, 就會消失.

效率上, 函數在第一次調用時需要編譯, 因此第一次調用速度較慢.

3. 腳本(script)

PowerShell在交互式Shell(interactive Shell)和腳本語言(script. Language)之間進行了平衡, 提供了執行腳本的能力. 腳本類似於函數, 存放在文件中, 調用時由PowerShell載入內存, 編譯並執行.

效率上來講, 腳本慢於函數(function), 主要原因在於函數只會在第一次調用時被編譯, 而腳本每次調用都會被編譯一次. 但是編譯後的執行階段, 他們的性能是近似相等的.

4. native Windows command

我不知道應該這個東西用什麼名字. 這類命令在Windows世界大量存在, 譬如: dir, findstr, del, ping. 這些命令就是Windows之前的可執行文件(非.Net命令行可執行文件). 在PowerShell中調用這些命令效率是最低的, 因爲執行他們PowerShell需要創建一個新進程. 此外因爲這些命令早於PowerShell, 因此他們的信息輸出都是基於文本的(也可以說是字符串), 因此喪失了PowerShell對對象的處理能力. 因此, 如果你知道PowerShell的實現, 就避免使用這些命令.

討論完命令, 我簡單介紹下別名(alias):

PS C:\> (Get-Command -CommandType alias).count

101


你一定在想, PowerShell爲什麼提供了這麼多別名, 難道要累死我們??

PowerShell爲了方便使用windows和unix, linux的人們, 支持了兩套別名, 譬如dir相對於ls, 還有unix, linux的grep等. 這樣無論你使用windows還是linux都能相對來說快速的上手PowerShell.

PowerShell Version 1.0中有一個缺陷, 既定義別名時, 不允許指定參數. 這無疑是PowerShell的一個缺陷. 但是因爲cmdlet中參數較少(一般都是10個以內), 因此大多數時候, 你不需要定義帶有參數的別名, 如果真的需要, 可以用函數來替代. 這種缺陷, 與代碼塊的執行等功能有衝突. 希望在後續版本能有別名功能能夠更加強大.

寫在最後:

如果您有幸堅持看了我的囉唆, 我非常的感激. 接下來的3, 4講也會偏向於概念而非更多的語法. 任何事, 請相信你對解釋器行爲的理解, 對語言的特性的理解, 都會讓你在編寫該語言代碼時受益匪淺. 因此, 請堅持, 努力的去學習. 我希望在這份漫長教程過程中, 帶給大家更多計算機歷史, 發展; 不同語言, 技術的對比; 編寫健壯代碼(無論是像C, C#還是像sh, PowerShell)的思路. 在03, 04中, 我會介紹兩個關鍵核心的概念(算法??), 參數綁定和類型轉換.

學習一門語言, 還能學到編程的心得, 這也是我希望的.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章