Windows Powershellオブジェクトの作成

9035 ワード

New-Objectによる新規オブジェクトの作成
コンストラクション関数を使用して指定したタイプのインスタンスオブジェクトを作成する場合は、署名が一致するコンストラクション関数を少なくとも1つ含まなければなりません.たとえば、文字と数値で指定した数の文字を含む文字列を作成できます.
 
  
PS C:Powershell> New-Object String(‘*',100)

******************************************************************************* *********************
StringクラスにVoidが含まれているため、上記の方法がサポートされている.ctor(Char,Int 32)コンストラクタ
 
  
PS C:Powershell> [String].GetConstructors() | foreach {$_.tostring()}
Void .ctor(Char*)
Void .ctor(Char*, Int32, Int32)
Void .ctor(SByte*)
Void .ctor(SByte*, Int32, Int32)
Void .ctor(SByte*, Int32, Int32, System.Text.Encoding)
Void .ctor(Char[], Int32, Int32)
Void .ctor(Char[])
Void .ctor(Char, Int32)

タイプ変換によるオブジェクトの作成
タイプ変換でNew-Objectに代わることができます
 
  
PS C:Powershell> $date="1999-9-1 10:23:44"
PS C:Powershell> $date.GetType().fullName
System.String
PS C:Powershell> $date
1999-9-1 10:23:44
PS C:Powershell> [DateTime]$date="1999-9-1 10:23:44"
PS C:Powershell> $date.GetType().FullName
System.DateTime
PS C:Powershell> $date

1999 9 1 10:23:44


条件が許可されている場合は、オブジェクトを直接配列に変換することもできます.
 
  
PS C:Powershell> [char[]]"mossfly.com"
m
o
s
s
f
l
y
.
c
o
m
PS C:Powershell> [int[]][char[]]"mossfly.com"
109
111
115
115
102
108
121
46
99
111
109

プログラムセットのロード
簡単なCクラスライブラリをカスタマイズしてTestにコンパイルします.dll:
 
  
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;

namespace Test
{
    public class Student
    {
        public string Name { set; get; }
        public int Age { set; get; }
        public Student(string name, int age)
        {
            this.Name = name;
            this.Age = age;
        }
        public override string  ToString()
        {
            return string.Format("Name={0};Age={1}", this.Name,this.Age);
        }
    }
}


Powershellにこのdllをロードし、その中のStudioクラスのコンストラクション関数を使用してインスタンスを生成し、最後にToString()メソッドを呼び出します.
 
  
PS C:Powershell> ls .Test.dll

    : C:Powershell

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---         2012/1/13     10:49       4608 Test.dll

PS C:Powershell> $TestDLL=ls .Test.dll
PS C:Powershell> [reflection.assembly]::LoadFile($TestDLL.FullName)

GAC    Version        Location
---    -------        --------
False  v2.0.50727     C:PowershellTest.dll

PS C:Powershell> $stu=New-Object Test.Student('Mosser',22)
PS C:Powershell> $stu

Name                                                                        Age
----                                                                        ---
Mosser                                                                       22

PS C:Powershell> $stu.ToString()
Name=Mosser;Age=22


COMオブジェクトの使用
としてNETの補足で、PowershellはCOMオブジェクトをロードおよびアクセスできます.
使用可能なCOMオブジェクトの表示
各COMオブジェクトにはレジストリに格納された一意の識別子があり、使用可能なCOMオブジェクトにアクセスしたいが、レジストリに直接アクセスする.
 
  
Dir REGISTRY::HKEY_CLASSES_ROOTCLSID  -include PROGID -recurse | foreach {$_.GetValue("")}
DAO.DBEngine.36
DAO.PrivateDBEngine.36
DAO.TableDef.36
DAO.Field.36
DAO.Index.36
PS C:Powershell> Dir REGISTRY::HKEY_CLASSES_ROOTCLSID -include PROGID -recurse
| foreach {$_.GetValue("")} | select -First 10
DAO.DBEngine.36
DAO.PrivateDBEngine.36
DAO.TableDef.36
DAO.Field.36
DAO.Index.36
DAO.Group.36
DAO.User.36
DAO.QueryDef.36
DAO.Relation.36
file
......

COMオブジェクトの使用方法
COMオブジェクトのProgIDが取得されると、New-Objectを使用してCOMオブジェクトを作成できます.パラメータを-comObjectと指定するだけです.
 
  
PS C:Powershell> New-Object -ComObject DAO.Relation.36

Properties     : System.__ComObject
Name           :
Table          :
ForeignTable   :
Attributes     : 0
Fields         : System.__ComObject
PartialReplica :
COM .NET , Get-Member :

PS C:Powershell> $DBEng=New-Object -ComObject DAO.PrivateDBEngine.36
PS C:Powershell> $DBEng | Get-Member -me *method

   TypeName: System.__ComObject#{00000021-0000-0010-8000-00aa006d2ea4}

Name                MemberType Definition
----                ---------- ----------
BeginTrans          Method     void BeginTrans ()
CommitTrans         Method     void CommitTrans (int)
CompactDatabase     Method     void CompactDatabase (string, string, Variant...
CreateDatabase      Method     Database CreateDatabase (string, string, Vari...
CreateWorkspace     Method     Workspace CreateWorkspace (string, string, st...
FreeLocks           Method     void FreeLocks ()
Idle                Method     void Idle (Variant)
ISAMStats           Method     int ISAMStats (int, Variant)
OpenConnection      Method     Connection OpenConnection (string, Variant, V...
OpenDatabase        Method     Database OpenDatabase (string, Variant, Varia...
RegisterDatabase    Method     void RegisterDatabase (string, string, bool, ...
RepairDatabase      Method     void RepairDatabase (string)
Rollback            Method     void Rollback ()
SetDataAccessOption Method     void SetDataAccessOption (short, Variant)
SetDefaultWorkspace Method     void SetDefaultWorkspace (string, string)
SetOption           Method     void SetOption (int, Variant)
_30_CreateWorkspace Method     Workspace _30_CreateWorkspace (string, string...

PS C:Powershell> $DBEng | Get-Member -me *property

   TypeName: System.__ComObject#{00000021-0000-0010-8000-00aa006d2ea4}

Name            MemberType Definition
----            ---------- ----------
DefaultPassword Property   string DefaultPassword () {set}
DefaultType     Property   int DefaultType () {get} {set}
DefaultUser     Property   string DefaultUser () {set}
Errors          Property   Errors Errors () {get}
IniPath         Property   string IniPath () {get} {set}
LoginTimeout    Property   short LoginTimeout () {get} {set}
Properties      Property   Properties Properties () {get}
SystemDB        Property   string SystemDB () {get} {set}
Version         Property   string Version () {get}
Workspaces      Property   Workspaces Workspaces () {get}


よく使うCOMオブジェクトには
WScript.Shell, WScript.Network, Scripting.FileSystemObject, InternetExplorer.Application, Word.Application, Shell.Application
次の例ではWscript.shell COMオブジェクトとその方法CreateShortcut()デスクトップにPowershellショートカットを作成します.
 
  
PS C:Powershell> $wshell=New-Object -ComObject WScript.shell
PS C:Powershell> $path=[environment]::GetFolderPath('Desktop')
PS C:Powershell> $link=$wshell.CreateShortcut("$pathPowershell.lnk")
PS C:Powershell> $link | Get-Member

   TypeName: System.__ComObject#{f935dc23-1cf0-11d0-adb9-00c04fd58a0b}

Name             MemberType Definition
----             ---------- ----------
Load             Method     void Load (string)
Save             Method     void Save ()
Arguments        Property   string Arguments () {get} {set}
Description      Property   string Description () {get} {set}
FullName         Property   string FullName () {get}
Hotkey           Property   string Hotkey () {get} {set}
IconLocation     Property   string IconLocation () {get} {set}
RelativePath     Property   string RelativePath () {set}
TargetPath       Property   string TargetPath () {get} {set}
WindowStyle      Property   int WindowStyle () {get} {set}
WorkingDirectory Property   string WorkingDirectory () {get} {set}

PS C:Powershell> $link.TargetPath='Powershell.exe'
PS C:Powershell> $link.Description=" Powershell"
PS C:Powershell> $link.WorkingDirectory=$PROFILE
PS C:Powershell> $link.IconLocation='Powershell.exe'
PS C:Powershell> $link.Save()