PowerShell中的基礎資料型別

深藍發表於2015-05-22

PowerShell是一個物件導向的語言,在申明變數的時候不強制要求申明資料型別,使用$開頭來申明變數即可。

基本資料型別

PowerShell本身是基於.Net開發出來的,所以在.Net中的基本資料型別,在PowerShell中也可以使用,只是在PowerShell中用”[]”來標識具體的資料型別。比如[int],[long],[string],[bool],[double]等。

使用-is來判斷某個變數是否指定的資料型別,和C#中的is關鍵字是一樣的。比如:

$a=10; 
$a -is [int] 
$a -is [double]

第二行返回True,第三行返回False。

我們也可以在定義變數時指定資料型別。比如我們要定義decimal型別的10,那麼可以寫為:

[decimal]$c=10

$c.GetType() 可以看到我們的型別為Decimal。

資料型別轉換

關於預設資料型別轉換,PowerShell和C#的行為有所不同。PowerShell會根據第一個變數的型別作為目標型別,然後將運算後面的聯絡轉換為第一個型別。比如我們申明兩個變數:

$a=10; 
$b="10";

如果我們使用加法運算:

$a+$b

該運算會返回20,因為第一個變數是int型別的,所以後面的變數都會轉換為int型別。如果我們調整變數的順序:

$b+$a

該運算返回的結果為1010,因為第一個變數是string型別。習慣了C#的預設型別轉換,那麼我們可以強制進行型別轉換後再進行運算。強制型別轉換的方法也是與C#相同。

比如我們要按int型別來計算,那麼我們第二個加法可以改為:

[int]$b+$a

我們也可以使用-as命令,那麼第二個加法改為:

($b -as [int])+$a

List/Array型別

我們平時使用的各種Get-XXX命令,很多都是返回對應型別的Array,比如Get-Process.

如果我們要定義一個集合,那麼可以使用”@(物件1,物件2,物件3…)”的格式申明集合。比如我們定義一個字串集合:

$a=@('a','bb','ccc')

其實不使用@和括號也是可以的,只需要用逗號分割各個Item即可。

$a='aaa','bb','c'

如果是申明一個空的集合,就必須寫為:

$a=@()

與C#不同的是,在PowerShell中,往集合中新增元素,可以使用+=符號。

$a=@() 
$a+="abc" 
$a+="dddd" 
Write-Host $a

如果要移除某個元素,那麼就不簡單了,需要使用Where查詢(簡寫為?),找出要保留的元素,然後將保留的元素集合再重新賦值會變數。比如對於字串集合,我們要移除字元c,那麼操作如下:

$a=@('aaa','bb','c') 
$a$a | ? {$_ -ne 'c'} 
Write-Host $a

訪問某個元素使用[idx]即可和C#相同。至於對集合的各種操作,可以參見我上一篇博文

Hashtable/Dictionary型別

雜湊表就是一個Key-Value對的集合。雜湊表的建立格式如下:

@{Key1=Value1;Key2=Value2;…}

這裡Key一般是字串,但是並不需要用引號引起來(當然,使用了引號更好),Value可以是任意型別。比如我們建立一個員工和部門的Hashtable,命令如下:

$a=@{Devin="IT";Edward="Finance";Jeneen="Sale"}

使用keys屬性可以獲得雜湊表的Key列表,使用values屬性可以獲得Value列表。

如果要往雜湊表中新增元素,可以使用.Add(Key,Value)方法。比如新增一個員工:

$a.Add("Julia","Logisitcs")

這裡需要注意的是Key必須要帶引號。而且雜湊表的Key是不允許重複的,如果已經存在相同的值,新增會報錯。可以先判斷Key是否存在,然後再新增:

if(-not $a.ContainsKey("Julia")) 

$a.Add("Julia","Logisitcs"
}

如果要移除某個Key對應的元素,那麼可以呼叫.Remove(Key)函式即可。

$a.Remove("Julia")

如果要訪問某個Key對應的值,有兩種方法:

$a["Devin"
$a.Devin

需要注意的是,直接對雜湊表進行Sort-Object是沒有效的,我們必須先呼叫GetEnumerator方法,把雜湊錶轉換後在執行Sort。

$a.GetEnumerator() | Sort-Object Name

相關文章