天天看點

Powershell學習筆記——變量和指令

  Powershel支援變量,這個功能對用慣了CMD的開發人員來說,那簡直就是驚喜——終于可以結束總是把環境變量搞亂的痛苦日子了。

  Powershell的變量是以$号作為字首的,所有變量都必須以$号開頭,比如$var1, $my_var_2……。按照慣例,變量名當然是字母數字和下劃線的組合。不過Powershell的變量不完全符合慣例——它的變量幾乎允許任意字元。不過,當你準備使用“$my var”這個“變量”的時候,你會得到一個錯誤,因為,對于包含特殊字元的變量名,需要點特别的标記——用一對大括号括起來——當然,如果你不嫌麻煩的話,你也可以用同樣的手段來包裝一下不含特殊字元的變量名。來看示例:

PS F:\> $var1 = 1 

PS F:\> ${my var} = 2 

PS F:\> "$var1, ${my var}, ${var1}" 

1, 2, 1 

PS F:\> 

  驚喜到這裡還未結束。Powershell的變量都是有類型的,因為它們都對應于.NET中的基本資料類型,或者對象。做個實驗:

PS F:\> ${my var}.getType().fullName 

System.Int32 

PS F:\> $var2 = "James Fancy" 

PS F:\> $var2.getType().fullName 

System.String 

  可以看到,剛才定義的${my var}是Int32類型,而新定義的$var2是String類型,而它們的類型,完全是由它們的值決定的,這個,仔細觀察一下定義這兩個變量的那兩條指令就明白了。于是,這裡引發一個問題,既然變量是有類型的,那是否可以指定類型呢?答案是肯定的:

PS F:\> [long] $var3 = 1 

PS F:\> $var3.getType().fullName 

System.Int64 

PS F:\> [string] $var3 = $var3 

  這個例子很好的解釋了,可以通過字首由方括符包含的類型名稱來為變量指定類型,而且還帶出兩點驚喜:第一,變量的類型是可以改變的;第二,從長整型到字元串類型可以直接轉換而不需要特别的工具或者函數,當然,這還可以擴充到其它類型的轉換。

  現在我們需要了解一下,常見的類型都有哪些呢?簡單的列舉一下:bool、char、byte、sbyte、int16、int32或int、int64或long、uint16、uint32、uint64、float或single、double、string、datetime、guid、xml、switch……除此之外,還有另外一些内置的類型,以及.NET庫中的所有類和結構——太給力了!

  這些内置資料類型之間大多可以自動轉換。在表達式中,如果存在混合類型的運算,多數時候是以先出現的那個變量的類型為準來進行運算,比如

PS F:\> 2 + "2" # 先出現整型,後面的字元串轉換為整進行整數運算 

PS F:\> "2" + 2 # 先出現字元串型,後面的整形轉換成字元符進行連接配接運算 

22 

  變量是有了,Powershell能定義常量麼?當然可以,不過需要用new-variable來定義:

PS F:\> new-variable myConst "James Fancy" -option constant 

PS F:\> $myConst 

James Fancy 

  常量是不能改變的,嘗試給它重新指派會抛出錯誤。這不是悲劇,悲劇的是,常量不能被删除,就算加上-force參數也不能被删除。

PS F:\> del -force variable:myConst 

Remove-Item : 無法删除變量 myConst,因為該變量為常量或者為隻讀變量。如果該變量 

為隻讀變量,請指定 Force 選項,然後重試此操作。 

所在位置 行:1 字元: 4 

+ del <<<<  -force variable:myConst 

    + CategoryInfo          : WriteError: (myConst:String) [Remove-Item], Sess 

   ionStateUnauthorizedAccessException 

    + FullyQualifiedErrorId : VariableNotRemovable,Microsoft.PowerShell.Comman 

   ds.RemoveItemCommand 

  不過這個常量并不是永駐于你的作業系統了,隻需退出目前控制台,再開啟一個新的控制台,你就會發現,一些都是嶄新的,沒有之前定義的一切東西:函數、變量以及删不掉的常量。

  話說回來,如果需要一個可以删除的常量,那不妨考慮下隻讀變量,隻讀變量有兩種方式産生,一種是跟定義常量一樣,在通過new-variable指令定義的時候指定-option為readonly;另一種是在變量已經存在的情況下,改變其選項。

PS F:\> new-variable rVar "James" -option readonly # 第一種方法 

PS F:\> $rVar2 = "Fancy" # 第二種方法,先定義一個普通變量 

PS F:\> (get-variable rVar2).options = "readonly" # 再通過get-varialbe取得變量對象并改變選項 

PS F:\> # 當然上面這句話也可以用set-varialbe指令來完成,就像這樣 

PS F:\> # set-variable rVar2 -option readonly 

  隻讀變量是可以被删除的,當然需要-force參數。隻讀變量也可以變回普通變量,隻需要改變其選項,當然也需要-force參數。

PS F:\> del variable:rVar -force # 删除隻讀變量rVar 

PS F:\> set-variable rVar2 -option none -force # 将rVar2變成普通變量 

  上面提到變量的時候已經多次使用了“variable:變量名”這種形式的東東。這裡的“varialbe:”被稱作Device,就好像C:、D:、E:、F:一樣。也許了解起來有點困難,不過,把它想像成“命名空間”應該就好了解了。

  上面的示例中定義了$var1、$var2、${my var}等變量,其它它們的全稱應該是$variable:var1、$variable:var2、${varialbe:my var}。除了variable之外,常用的命名空間還有env、function、alias等。

  如果想知道Powershell有哪些指令可以用,help已經說明了,可以用get-command來檢視。在控制台輸入help get-command之後,就可以看到get-command的用法。

  在get-command的文法中可以看到一個-CommandType參數,它允許get-command按類型查詢指令,其中類型包括Alias、Function、Filter、Cmdlet、ExternalScript、Application和Script。最後一項scrip我沒搞懂,不過前面幾項分别是:

√ Alias,别名,通過set-alias指令為Cmdlet、Function等指令設定的一個簡單易記的名稱。

√ Function,函數,你懂的。

√ Filter,一種特别的函數,用于在重定向操作中過濾對象清單。

√ Cmdlet,可以了解為Powershell的内置指令——當然,Powershell的内置指令是可以擴充的。

√ ExternalScript,所有在路徑(由$env:path變量的值說明)中的.ps1腳本

√ Application,毫無懸念,路徑中的.exe檔案(其實應該說是PE檔案,因為.dll等也算在内)

  Cmdlet是Powershell的内置指令,比如之前用到的get-command就是一個Cmdlet。按Powershell的規範,Cmdlet的名字都是由動詞和賓語構成的,以說明這個Cmdlet的作用,其結構是“動詞-賓語”。比如get-command的意思就很明顯,是擷取指令相關的資訊的。

  同樣,通過help get-command,可以在其說明文檔中找到get-command的第二種文法裡有一個-verb參數,提供通過動詞來查找指令的功能。這裡的動詞包括get、set、test……很多,而且可以自己定義。比如“get-command -verb go”找不到有比對的指令,但是如果定義了一個名叫"go-url"的函數之後,再運作“get-command -verb go”就可以将剛定義的“go-url”顯示出來了,就像這樣:

PS F:\> get-command -verb go 

PS F:\> function go-url() { "going..." } 

CommandType Name Definition 

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

Function go-url param()... 

  上面提到Cmdlet是可以擴充的,的确如此。你可以自己按照規範來寫DLL擴充Cmdlet,當然那不是一件簡單的事情。對于腳本的正常用法來說,它太複雜了,是以我在短期内沒準備去學習它。

  我們曾經多次使用help指令,其實它是一個别名——或者說得拟人一點,叫昵稱。help是get-help的另一個名字,輸入get-help很麻煩,因為它包含8個字元,其中一個還是符号,是以懶人們發明了“别名”,為它取了另一個更簡明的名字,help。

  當然,并不是隻有get-help享受了這個待遇。如果你在控制台中鍵入alias指令,就可以看到目前已經定義了的所有别名,以及它們對應的原始指令。當然,這裡顯示的隻是已經定義的,如果你願意,随時可以添加新的别名。比如剛才的示例中定義了一個go-url函數,那麼現在為它取個新名字,叫url:

PS F:\> set-alias url go-url 

PS F:\> url 

going... 

  甚至,還可以為别名指定别名,比如

PS F:\> set-alias myurl url 

PS F:\> get-alias url,myurl 

Alias url go-url 

Alias myurl url 

  這裡,get-alias會顯示指定的别名清單中每個别名的資訊。

如果不想要某個别名了,可以用del指令删除它——哦,del也是個别名,真實的指令是remove-item。

PS F:\> del alias:url 

本文轉自邊城__ 51CTO部落格,原文連結:http://blog.51cto.com/jamesfancy/680569,如需轉載請自行聯系原作者

繼續閱讀