PowerShell中的陣列使用

edwardking888發表於2011-06-15

在日常處理中,除了使用像“數值型別”和“字串型別”外,還需要使用能夠包含其他物件的“集合”型別(請注意,這裡的集合對應英文是Collection,而非數學概念上的Set。)。大多數常見語言,都提供一些操作集合型別的語法。最基本的集合型別就是陣列型別,它提供了一種下標基於0的陣列物件。

首先通過幾個簡單的例子,來了解一下PowerShell中的陣列是如何使用的。

PS C:\Users\Administrator> 1,'a',2MB,0x100

1

a

2097152

256

上面的小例子輸出了4個物件:數值“1”、字串“a”(注意:雖然只有一個字元,但這裡仍然是一個字串)、數值“2MB”和十六進位制數值“0x100”。也許您很想了解這個例子和陣列究竟有什麼聯絡,實際上這個例子清楚地解釋了PowerShell中陣列型別的語法。在PowerShell中,只要把不同的物件用逗號“,”連線起來,就可以構造出陣列物件。本章節的重點在於像大家介紹陣列型別的使用,因此將在後續的章節詳細介紹逗號表示式“,”的使用。我們回到剛才的例子中,雖然這4個物件組成了PowerShell中的陣列物件,但是如果沒有把這個物件儲存起來或者丟棄掉的話,PowerShell就會利用預設的格式器和輸出器將它們輸出到控制檯上。最終我們就看到了上面四行輸出結果。

現在我們知道了PowerShell中構造陣列的最簡單的方式,接下來讓我們一起探索更多關於陣列物件更多的特性:

PS C:\Users\Administrator> $array1 = 1,2,3,4

PS C:\Users\Administrator>  $int = 1

PS C:\Users\Administrator> $array1.count

4

PS C:\Users\Administrator>  "$array1"

1 2 3 4

PS C:\Users\Administrator> $int.count

PS C:\Users\Administrator> "$int"

1

細心的讀者肯定已經發現,在第一個例子中,使用了逗號構造了一個包含四個整數的陣列,並將其儲存在變數$array1中。接下來將數值1儲存在變數$int中。陣列物件上有一個屬性Count用來指出當前陣列中的物件數量,我們可以看到$array1中包含了4個物件。但是在$int上確沒有該屬性(注意:如果引用的屬性不存在,PowerShell返回$null物件,該物件不會對控制檯產生任何影響,只是簡單的使提示使用者繼續輸入命令)。

PowerShell是基於物件的shell,現在讓我們來看看陣列究竟是什麼物件:

PS C:\Users\Administrator>  $array1.GetType().FullName

System.Object[]

PowerShell中呼叫物件上的GetType()方法,可以得到該物件的型別物件(型別也是一個物件)。而該物件上的FullName屬性就是該物件表示的型別的名稱。這裡有點繞口令了,總之如果你想知道一個物件的型別就呼叫GetType()方法,再訪問FullName屬性就可以了。

學會了建立陣列以及知道了陣列包含的物件數量,現在來學習一下如何訪問陣列中的元素。實際上PowerShell的陣列其實通過.Net類庫中的陣列來實現的,也就是說PowerShell.Net類庫原有的實現上,增加了一些PowerShell便捷的訪問介面,而實際操作的物件還是.Net類庫中的物件。使用陣列時,需要大家記住陣列的第一個元素的下標是“0”、陣列的最後一個元素下標是陣列長度減去1。例如:

PS C:\Users\Administrator> $array = 1,2,3

PS C:\Users\Administrator> $array.Length

3

PS C:\Users\Administrator> $array[2]

3

PS C:\Users\Administrator> $array[1]

2

實際上,Count是屬性Length的別名,這主要是為不同物件提供一致性介面的技術。這裡需要特別注意的是,當陣列訪問越界時,PowerShell是不會給出任何錯誤資訊的,只會得到一個$null物件。

如果我們已經有一個陣列了,應該如何向這個陣列中新增新的元素呢?在Perl中,你只需簡單的使用你想使用的索引,然後儲存上你想儲存的數值就完成了任務。然而在PowerShell中,如果你使用類似的方法就會得到如下的結果:

PS C:\Users\Administrator> $a = "My ThinkPad", "My PC"

PS C:\Users\Administrator>  $a[0]

My ThinkPad

PS C:\Users\Administrator> $a[1]

My PC

PS C:\Users\Administrator>  $a[2] = "My Mac"

陣列賦值失敗,因為索引“2”超出範圍。

所在位置 行:1 字元: 5

+  $a[ <<<< 2] = "My Mac"

    + CategoryInfo          : InvalidOperation: (2:Int32) [], RuntimeException

    + FullyQualifiedErrorId : IndexOutOfRange


PS C:\Users\Administrator> $a = $a + "My Mac"

PS C:\Users\Administrator> $a

My ThinkPad

My PC

My Mac

PowerShell中,陣列其實是一個大小固定的資料結構,如果需要向陣列中新增更多的物件時,就必須使用加號“+”運算子。在執行“+”操作的過程中,PowerShell實際上進行了下述操作:

1)        首先建立一個新的陣列,該陣列的大小能夠存下運算結果的所有物件;

2)        將第一個陣列的成員拷貝到新陣列中;

3)        將第二個陣列的成員拷貝到新陣列中。

通過觀察這個操作過程,很容易發現:如果陣列中包含元素很多,而且頻繁的向陣列新增物件,一定會使PowerShell執行指令碼時更慢。因此,我們需要謹記:大多數時候,陣列是PowerShell中的便捷的工具,但是應該避免頻繁地對其進行新增操作。在.Net類庫中提供了其他的資料結構來滿足需要經常向陣列中新增物件的需求。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8183550/viewspace-698011/,如需轉載,請註明出處,否則將追究法律責任。

相關文章