とりあえずget-commandとget-helpでヘルプを見ながらある程度のことができるようになってきたら、次に把握すべきはPowerShellが「オブジェクト指向」である、ということだと思います。これは既存のほかのシェルとは決定的に異なる点であり、PowerShellのもっともすばらしい点だと思います。

具体的に見てみましょう。例えば文字列。

PSC:\>$hoge="hoge"

.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, “Courier New”, courier, monospace; background-color: #ffffff; /white-space: pre;/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }

これで$hogeという名前の変数の中に”hoge”という文字列が格納されました。・・・。では終わらないのがPowerShellのすごいところなのです。実はこの$hogeという変数の中に格納されたのは「オブジェクト」なのです。

型を確認してみましょう。これは「GetType()」メソッドで可能です。

PITSsrPuCue:b\l>ic$hITosrgSueee.rgieatltyNSpatemr(ei)ngBSayssetTeymp.eObject

このように、$hogeはString型だ、ということがわかります。PowerShellは.net frameworkを基盤にして動いています。ということはStringというのはつまりSystem.Stringだ、ということです。

となればもちろん各種プロパティやメソッドも持っています。

PSC:\>$hoge|member
 
 
TypeName:System.String
 
NameMemberTypeDefinition
CloneMethodSystem.ObjectClone()
CompareToMethodSystem.Int32CompareTo(Objectvalue),System.Int32CompareTo(StringstrB)
ContainsMethodSystem.BooleanContains(Stringvalue)
CopyToMethodSystem.VoidCopyTo(Int32sourceIndex,Char[]destination,Int32destinationIn...
EndsWithMethodSystem.BooleanEndsWith(Stringvalue),System.BooleanEndsWith(Stringvalue,
EqualsMethodSystem.BooleanEquals(Objectobj),System.BooleanEquals(Stringvalue),Syste...
GetEnumeratorMethodSystem.CharEnumeratorGetEnumerator()
GetHashCodeMethodSystem.Int32GetHashCode()
GetTypeMethodSystem.TypeGetType()
GetTypeCodeMethodSystem.TypeCodeGetTypeCode()
get_CharsMethodSystem.Charget_Chars(Int32index)
get_LengthMethodSystem.Int32get_Length()
IndexOfMethodSystem.Int32IndexOf(Charvalue),System.Int32IndexOf(Charvalue,Int32star...
IndexOfAnyMethodSystem.Int32IndexOfAny(Char[]anyOf),System.Int32IndexOfAny(Char[]anyOf,
InsertMethodSystem.StringInsert(Int32startIndex,Stringvalue)
IsNormalizedMethodSystem.BooleanIsNormalized(),System.BooleanIsNormalized(NormalizationForm
LastIndexOfMethodSystem.Int32LastIndexOf(Charvalue),System.Int32LastIndexOf(Charvalue,In...
LastIndexOfAnyMethodSystem.Int32LastIndexOfAny(Char[]anyOf),System.Int32LastIndexOfAny(Char[]...
NormalizeMethodSystem.StringNormalize(),System.StringNormalize(NormalizationFormnormaliz...
PadLeftMethodSystem.StringPadLeft(Int32totalWidth),System.StringPadLeft(Int32totalWid...
PadRightMethodSystem.StringPadRight(Int32totalWidth),System.StringPadRight(Int32totalW...
RemoveMethodSystem.StringRemove(Int32startIndex,Int32count),System.StringRemove(Int...
ReplaceMethodSystem.StringReplace(CharoldChar,CharnewChar),System.StringReplace(Stri...
SplitMethodSystem.String[]Split(ParamsChar[]separator),System.String[]Split(Char[]
StartsWithMethodSystem.BooleanStartsWith(Stringvalue),System.BooleanStartsWith(Stringval...
SubstringMethodSystem.StringSubstring(Int32startIndex),System.StringSubstring(Int32star...
ToCharArrayMethodSystem.Char[]ToCharArray(),System.Char[]ToCharArray(Int32startIndex,Int3...
ToLowerMethodSystem.StringToLower(),System.StringToLower(CultureInfoculture)
ToLowerInvariantMethodSystem.StringToLowerInvariant()
ToStringMethodSystem.StringToString(),System.StringToString(IFormatProviderprovider)
ToUpperMethodSystem.StringToUpper(),System.StringToUpper(CultureInfoculture)
ToUpperInvariantMethodSystem.StringToUpperInvariant()
TrimMethodSystem.StringTrim(ParamsChar[]trimChars),System.StringTrim()
TrimEndMethodSystem.StringTrimEnd(ParamsChar[]trimChars)
TrimStartMethodSystem.StringTrimStart(ParamsChar[]trimChars)
CharsParameterizedPropertySystem.CharChars(Int32index){get;}
LengthPropertySystem.Int32Length{get;}

.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, “Courier New”, courier, monospace; background-color: #ffffff; /white-space: pre;/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }

わかりますでしょうか。単純に代入しただけの文字列が「オブジェクト」であり、「プロパティ」を持ち、「メソッド」を持っているわけです。もちろんこれらのプロパティやメソッドはPowerShellから自由に使用することができます。リファレンスとしてはMSDNがそのまま使えます。

ここまでの説明は、ある程度オブジェクト指向や.net frameworkのことを知っている人向けの説明になってしまっていますが、重要なことは「PowerShellをつかうとC#などの.netの言語でできることと同じことができてしまう」ということです。

.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, “Courier New”, courier, monospace; background-color: #ffffff; /white-space: pre;/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }

例えば、文字の長さを知りたければLengthプロパティを参照すればいいです。

P4SC:\>$hoge.length

.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, “Courier New”, courier, monospace; background-color: #ffffff; /white-space: pre;/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }

例えば大文字にしたければToUpperメソッドを使用すればいいです。

PHSOGCE:\>$hoge.ToUpper()

.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, “Courier New”, courier, monospace; background-color: #ffffff; /white-space: pre;/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }

すばらしいですね。

極論を言えば、C#のプログラミングと(ほぼ)まったく同じことをPowerShellで(ほぼ)まったく同じように書くことが可能だと言うことです。

あまり意味は無いですが、例えばウインドウの生成だってできちゃいます。

[$$$$$$$$[SfbbbbllfSyouuuuaaoysrttttbbrstmtttteemteooooll.em=nnnn.Cm....=Lo.RN=LTaonWeeoedNctifwNcxdearnl-eat_wtodeOwtC-ilocb-i=lOoswtjOoibn.siebn"cjA.ocjke=dFnte=(cdo.c{tNRrAStNeamsye$SwnsssSwly-g.ety-asOeAmesObtb(pbmtbeej(pl.ejlme$lyWme..cbi]i.cTWtuc:nWteita:dixnSttLonStdyoiowdyosnoasos=wt,nd.wtse]WFse".m$:io.mhF.l:trF.eoDaRhmoDlrrbuPsrrlmaena.maoswl(rFsw,.i)$to.iLn)firBnwagoamugob.rlt.rePmNtPllo)aoodimni"nen}t(t)("(1S10y0,s,t1e50m0).)Windows.Forms")

.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, “Courier New”, courier, monospace; background-color: #ffffff; /white-space: pre;/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }

実行すると、以下のようなウインドウが表示されます。

面白いですね。このようにPowerShellでは.net frameworkがその基盤として動いているため、.net frameworkの個々のクラスを利用しながらきちんとオブジェクト指向を使った柔軟なプログラミングができてしまうだけの力を備えているわけです。

ですが、もちろんこれは「そういう使い方もできる」という話です。オブジェクトを扱えることを生かして、シェルならではの短い表現で強力なことを実施できます。追々紹介していきます。