tech.guitarrapc.cóm

Technical updates

PowerShell で [T] に 変数を利用したい場合の方法

PowerShell で 型を呼び出す場合は、次のようにします。

[string]

では、この string などの部分を変数に置き換えれないのでしょうか。例えばこうです。

$type = "string"
[$type]

しかしこれはできません。

f:id:guitarrapc_tech:20140313063501p:plain

ではどうやるのかを見てみましょう。

目次

目標

静的メソッドを呼び出すことをゴールとします。

String.IsNullOrEmpty メソッド

[System.Type]::GetType(T) を利用する

簡単です。[System.Type]::GetType(T) を利用すればいいのです。

但し、指定するのは AssemblyQualifiedName である必要があります。

# stringではだめ
$typeName = "string"
[System.Type]::GetType($typeName)::IsNullOrEmpty($null)

[string] を見てみましょう。

[string] | select *
Module                     : CommonLanguageRuntimeLibrary
Assembly                   : mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
TypeHandle                 : System.RuntimeTypeHandle
DeclaringMethod            : 
BaseType                   : System.Object
UnderlyingSystemType       : System.String
FullName                   : System.String
AssemblyQualifiedName      : System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Namespace                  : System
GUID                       : 296afbff-1b0b-3ff5-9d6c-4e7e599f8b57
IsEnum                     : False
GenericParameterAttributes : 
IsSecurityCritical         : False
IsSecuritySafeCritical     : False
IsSecurityTransparent      : True
IsGenericTypeDefinition    : False
IsGenericParameter         : False
GenericParameterPosition   : 
IsGenericType              : False
IsConstructedGenericType   : False
ContainsGenericParameters  : False
StructLayoutAttribute      : System.Runtime.InteropServices.StructLayoutAttribute
Name                       : String
MemberType                 : TypeInfo
DeclaringType              : 
ReflectedType              : 
MetadataToken              : 33554509
GenericTypeParameters      : {}
DeclaredConstructors       : {Void .ctor(Char*), Void .ctor(Char*, Int32, Int32), Void .ctor(SByte*), Void .ctor(SByte*, Int32, Int32)...}
DeclaredEvents             : {}
DeclaredFields             : {m_stringLength, m_firstChar, Empty, TrimHead...}
DeclaredMembers            : {Int32 Compare(System.String, System.String), Int32 Compare(System.String, System.String, Boolean), Int32 Compare(System.String, System.String, System.StringComparison), Int32 Compare(System
                             .String, System.String, System.Globalization.CultureInfo, System.Globalization.CompareOptions)...}
DeclaredMethods            : {Int32 Compare(System.String, System.String), Int32 Compare(System.String, System.String, Boolean), Int32 Compare(System.String, System.String, System.StringComparison), Int32 Compare(System
                             .String, System.String, System.Globalization.CultureInfo, System.Globalization.CompareOptions)...}
DeclaredNestedTypes        : {}
DeclaredProperties         : {Int32 Length, Char FirstChar, Char Chars [Int32], Boolean LegacyMode}
ImplementedInterfaces      : {System.IComparable, System.ICloneable, System.IConvertible, System.IComparable`1[System.String]...}
TypeInitializer            : 
IsNested                   : False
Attributes                 : AutoLayout, AnsiClass, Class, Public, Sealed, Serializable, BeforeFieldInit
IsVisible                  : True
IsNotPublic                : False
IsPublic                   : True
IsNestedPublic             : False
IsNestedPrivate            : False
IsNestedFamily             : False
IsNestedAssembly           : False
IsNestedFamANDAssem        : False
IsNestedFamORAssem         : False
IsAutoLayout               : True
IsLayoutSequential         : False
IsExplicitLayout           : False
IsClass                    : True
IsInterface                : False
IsValueType                : False
IsAbstract                 : False
IsSealed                   : True
IsSpecialName              : False
IsImport                   : False
IsSerializable             : True
IsAnsiClass                : True
IsUnicodeClass             : False
IsAutoClass                : False
IsArray                    : False
IsByRef                    : False
IsPointer                  : False
IsPrimitive                : False
IsCOMObject                : False
HasElementType             : False
IsContextful               : False
IsMarshalByRef             : False
GenericTypeArguments       : {}
CustomAttributes           : {[System.SerializableAttribute()], [System.Runtime.InteropServices.ComVisibleAttribute((Boolean)True)], [System.Reflection.DefaultMemberAttribute("Chars")], [__DynamicallyInvokableAttribute(
                             )]}

String の場合、 このような指定であれば評価されます。

$typeName = [string].AssemblyQualifiedName
[System.Type]::GetType($typeName)::IsNullOrEmpty($null)

あるいは FullNameでも。

$typeName = [string].FullName
[System.Type]::GetType($typeName)::IsNullOrEmpty($null)

サンプル

前記事の、PowerShell で Windows の 資格情報マネージャー を利用する (Jenkins などでの Git Credentialなど) で紹介したモジュールで利用したりしています。

PSWinCredManager / Get-PSWinCredManagerCredential.ps1

まとめ

やりたくなりますよねー。はい。