Windows PowerShell 2.0言語のフォントタイプシステム

8565 ワード

PowerShell言語では、カッコで囲まれたタイプ名を使用して、.NETの最下位のSystem.Typeオブジェクトインスタンスを返す文字型(type Literals)を使用してタイプにアクセスできます.
PS C:\> [System.Int32]



IsPublic IsSerial Name                                     BaseType

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

True     True     Int32                                    System.ValueType



PS C:\> [System.String]



IsPublic IsSerial Name                                     BaseType

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

True     True     String                                   System.Object



PS C:\> [System.Diagnostics.Process]



IsPublic IsSerial Name                                     BaseType

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

True     False    Process                                  System.ComponentM...

                               System.ComponentM...

Systemネーミングスペースのプレフィックスは、ほとんどのタイプがネーミングスペースの下にあるため、いかなる場合でも繰り返す必要はありません.PowerShellでは、次のような接頭辞を省略できます.
PS C:\> [Diagnostics.Process]



IsPublic IsSerial Name                                     BaseType

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

True     False    Process                                  System.ComponentM...

    ,             。

(1)int、short long:    System.Int32、System.Int16 Sytem.Int64  。

(2)byte sbyte:      System.Int32     System.SByte  。

(3)void:      。

(4)string:  System.String  。

(5)float single:  System.Single double   Sytem.Double  。

(6)decimal:  System.Decimal   。

(7)regex:  System.Text.RegularExpressions.Regex。

(8)adsi:  System.DirectoryServices.DirectoryEntry。

(9)wmi、wmiclass wmisearcher:    System.Management.

ManagementObject、System.Management.

ManagementClass System.ManagementObjectSearcher。

別名の意味を記憶する必要はありません.次のようにクエリーできます.
PS C:\> ([regex]).Fullname

System.Text.RegularExpressions.Regex

PS C:\> ([adsi]).Fullname

System.DirectoryServices.DirectoryEntry

PS C:\> ([wmisearcher]).Fullname

System.Management.ManagementObjectSearcher

PS C:\> ([wmi]).Fullname

System.Management.ManagementObject

タイプ変換
元のオブジェクトの前にフォントタイプを配置すると、通常、フォントタイプはシェルにオブジェクトタイプの変換を完了するように通知します.正しい場合は、新しいオブジェクトが返されます.次の例では、文字列を整数に変換します.
PS C:\> $str="10"

PS C:\> $str.GetType().FullName

System.String

PS C:\> $Num=[int]$str

PS C:\> $Num

10

PS C:\> $Num.GetType().FullName

System.Int32

文字列自体が変換できる場合は、変換が便利です.エラーが発生します.次の例では、変換エラー時に例外を放出します.
PS C:\> [int] "not a integer string" 
Cannot convert value "not a integer string" to type "System.Int32". 
Error: "           。"  
At line:1 char:6 + [int] <<<< "not a integer string"
 
  

PowerShell主要依靠.NET框架类型转换机制并为开发人员提供了方便的类型转换工具,处理类型转换任务的策略如下。

(1)检查是否可以从旧类型转换到新类型,如果在.NET中可以实现,类型必须相同或其中一个直接或者间接继承。

(2)如果类型间转换已经被内置到语言中,PowerShell会尝试使用这些方法。

(3)查找TypeConverter或PSTypeConverter相关类,前者是.NET内置的类型转换机制;后者是PowerShell特定的类型转换对象。二者均通过用正确的.NET属性标记目标自定义类、关联目标类型和编译类型类。很多现在.NET类已与类型转换器关联,PowerShell能够将这些类无缝地在类型间转换。另外,可以在Shell扩展类型系统的配置文件中将类型与类型转换器关联起来。

(4)尝试从原始对象转换到字符串类型,通过调用目标对象类型的Parse()方法从字符串类型转换到目标类型。

(5)查找可以接受原始类型对象的新类型结构体,如果找到,则用其构造新对象。

(6)搜索两种对象类型的显式或隐式转换操作符,适当的操作符会被编译成分别以op_Explicit和op_Implicit命名的显示和隐式静态方法。如果找到了合适的方法,将会调用该方法转换并返回对象。

(7)检查原始类型是否已经执行.NET的IConvertible接口,如果执行,类型能够转换为诸如int、double及decimal之类的基础类型。

PowerShell的内置类型转换规则如下。

(1)每一个对象能够被转换为PSObject,PowerShell会自动执行这个操作。大部分情况下没有参考对象,但是使用指向实际对象的PSObject实例。

(2)void被转换为转换$null,如:

PS C:\> ([void] 5) -eq $null

True

(3)すべてのオブジェクトと集合タイプを配列に変換できます.ここでの集合はICollextionインタフェースを実行する.NETタイプとして定義されます..NETフレームワークには複数の組み込み集合クラスがあり、集合クラスは開発者がインタフェースを呼び出すことによって実行されます.これは、どの集合を配列に変換できるかを意味します.
PS C:\> ([object[]] 5).GetType().FullName

System.Object[]

PS C:\> $string = New-Object Collections.Specialized.StringCollection

PS C:\> ([object[]] $string).GetType().FullName

System.Object[]

(4)すべてのオブジェクトを、空でないオブジェクトとnullでないオブジェクトとを真の方法でBooleanタイプに変換することができる.
(5)すべてのオブジェクトをstringタイプに変換することができる.
(6)IDictionaryオブジェクトはハッシュテーブルに変換することができ、.NETフレームワークのIDictionaryインタフェースは一連のキー値マッピングを持つオブジェクトによって実行される.ハッシュテーブルクラスはディクショナリオブジェクトによく用いられ、次の例ではOrderedDictionaryオブジェクトからハッシュテーブルに変換する.
PS C:\> $dict=New-Object Collections.Specialized.OrderedDictionary

PS C:\> $dict["item1"]=3

PS C:\> $hash=[Hashtable] $dict

PS C:\> $hash



Name                           Value

----                           -----

item1                          3



PS C:\> $hash.GetType().FullName

System.Collections.Hashtable

PS C:\> $dict.GetType().FullName

System.Collections.Specialized.OrderedDictionary

変数をRSReferenceに変換するには、プロトタイプを指すデータム変数を作成する必要があります.
PS C:\> $a=3

PS C:\> $b=[ref]$a

PS C:\> $b.Value=4

PS C:\> $b.Value

4

PS C:\> $a

4

7章で詳しく紹介します.
(7)適切な形式の文字列をXML文書に変換することができる.
PS C:\> $doc=[xml] "<root><item>2</item></root>"

PS C:\> $doc.root.item

2

(8)スクリプトブロックを.NETに変換できる委任はメソッドまたはスクリプトブロックを指すオブジェクトタイプであり、通常はオブジェクトトリガイベント処理コードとして作用する.トリガ可能なイベントの.NETタイプを使用する場合、通常はスクリプトブロックを委任に変換する必要がある.
名前、パス、またはクエリー文字列から変換すると、オブジェクトを作成および取得できます.
(9)文字列を文字配列に変換します.
PS C:\> [char[]] "Chars"

C

h

a

r

s

(10)文字列は正規表現に変換できます.この場合、文字列は次のように一致モードとして使用されます.
PS C:\> ([regex] "a.*?b").GetType().FullName

System.Text.RegularExpressions.Regex

(11)文字列は、WMIオブジェクトを作成することができる(22章参照).
PS C:\> [wmisearcher] 'select * from Win32_Process'

Scope     : System.Management.ManagementScope

Query     : System.Management.ObjectQuery

Options   : System.Management.EnumerationOptions

Site      :

Container :



PS C:\> [WMI]'\\.\root\cimv2:Win32_Process.Handle=0'

……

Description                : System Idle Process

……



PS C:\> ([wmiclass] "Win32_Share").GetType().FullName

System.Management.ManagementClass

(12)文字列をActive Directoryインスタンスに変換し、変換プロセスではDircetoryEntryパスとして文字列を使用します.次の例では、アダプタビューの代わりにPSBaseを使用して実際のオブジェクトタイプを取得します.
PS C:\> $user=[ADSI]"WinNT://./Server,admin"

PS C:\> $user.PSBase.GetType().FullName

System.DirectoryServices.DirectoryEntry

(13)文字列は.NETタイプを指すことができ、入力文字列はタイプ名として扱われ、Systemネーミングスペース接頭辞も省略することができる.
PS C:\> [type] "System.Diagnostics.Process"



IsPublic IsSerial Name                                     BaseType

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

True     False    Process                                  System.ComponentM...



PS C:\> [type] "Diagnostics.Process"



IsPublic IsSerial Name                                     BaseType

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

True     False    Process                                  System.ComponentM...

静的メンバーへのアクセス
文字列タイプは、静的属性とメソッドにアクセスするために使用できます.このため、文字列タイプとメンバー名を分割するには、二重コロン(:)を使用します.次の例では、静的属性値を取得します.
PS C:\> [datetime]::Today



2008 12 16  0:00:00

静的メソッドの呼び出しと同様に、次の例ではParseメソッドを呼び出してdoubleオブジェクトを作成します.
PS C:\> [double]::Parse("2.5")

2.5
まとめ
PowerShellは強力で複雑な言語として、あまり厳しくないか、初心者に友好的ではありません.すべてのオブジェクトタイプをアダプタと拡張によって統一的にアクセスするため、ユーザーは迅速に入手する方法を見つけることができます.最も一般的なオブジェクトは、エンティティの拡張を取得し、スクリプト作成者の創造性を向上させ、学習の難易度を低減することです.
必要に応じてタイプ拡張システムがエンジンでオブジェクトを変換することで、貴重な時間を節約し、スクリプトの読み取り可能性を向上させます.PowerShellにはNETとWindowsのオリジナルパワーは、強力なミックススクリプト言語になります.
セディネットアドレス:http://tech.ccidnet.com/art/33093/20100610/2082895_1.html
作者:付海军出典:http://fuhj02.cnblogs.com版権:本文版権帰作者とブログ园共有転載:転載を歓迎して、作者の創作の情熱を保存するために、要求に従って【転載】してください.ありがとうございます要求:作者の同意を得ずに、この声明を保留しなければなりません;文章の中で原文の接続を出さなければなりません;さもなくば法律の責任の個人のウェブサイトを追及しなければなりません:http://txj.shell.tor.hu