1

PowerShellからC#にオブジェクトを返したいので、C#はC#コード内のオブジェクトを使用して任意のメソッドを呼び出し、オブジェクトからプロパティを取得します。

たとえば、pshyperv.codeplex.comのHyper-Vモジュールを使用してホストからVMを取得するPowerShellスクリプトがあります。(このGetVM.ps1は、オブジェクトを返すための説明の単なる例です)。

Execute()からPowerShellスクリプトを実行し、オブジェクトを返すと、ttt()からオブジェクトの任意のメソッドを呼び出します。

  1. PowerShellからC#にオブジェクトを返すための可能な解決策はありますか?
  2. (PowerShell、C#)が見つかった場合、サンプルコードの誤りを修正できますか?

パワーシェル

Param (
    [String]
    $vmHost = '.',
    [String]
    $vmName
)
Process{
    $private:scriptname = $local:myInvocation.MyCommand.Name
    if  (($vmHost -eq '.' ) -and ($vmName -eq 'ITE'))
    {
        #Write-Output "Executing $private:scriptname on $vmHost"
    }
    try {
        return (Get-VM -Name $vmName -Server $vmHost)
    } catch {Write-Error "Unable to create a VM: $vmName"}
}

C#

public void ttt()
{
    ...
    ret = ps.Execute(rs, "GetVM.ps1 -vmName 'ITE*' |out-string");

    Trace.WriteLine(ret[0].Name);
}


public object Execute(Runspace runSpace, string command)
{
    bool error = false;
    StringBuilder retStr = new StringBuilder();

    pipeline.Commands.AddScript(command);

    Collection<PSObject> results = pipeline.Invoke();

    foreach (object item in pipeline.Error.ReadToEnd())
    {
        error = true;
        strOutput.AppendLine(item.ToString());
        retStr.Append(item.ToString());
    }

    foreach (PSObject obj in results)
    {
        strOutput.AppendLine(obj.ToString());
        retStr.Append(obj.ToString());
    }

    strOutput.Append("\r\n");

    return results;
}

PowerShellの実行結果:

PS C:\CVS\IteExtensionCode\Virtualization\VirtualizationTest\Tools\Virtualization\Hyper-V\W2K8> .\GetVM.ps1 -vmName 'ITE*'  |gm


   TypeName: System.Management.ManagementObject#root\virtualization\Msvm_ComputerSystem

Name                          MemberType    Definition
----                          ----------    ----------
VMElementName                 AliasProperty VMElementName = ElementName
RequestStateChange            Method        System.Management.ManagementBaseObject RequestStateChange(System.UInt16 RequestedState, System.String TimeoutPer...
SetPowerState                 Method        System.Management.ManagementBaseObject SetPowerState(System.UInt32 PowerState, System.String Time)
AssignedNumaNodeList          Property      System.UInt16[] AssignedNumaNodeList {get;set;}
Caption                       Property      System.String Caption {get;set;}
CreationClassName             Property      System.String CreationClassName {get;set;}
Dedicated                     Property      System.UInt16[] Dedicated {get;set;}
Description                   Property      System.String Description {get;set;}
ElementName                   Property      System.String ElementName {get;set;}
EnabledDefault                Property      System.UInt16 EnabledDefault {get;set;}
EnabledState                  Property      System.UInt16 EnabledState {get;set;}
HealthState                   Property      System.UInt16 HealthState {get;set;}
IdentifyingDescriptions       Property      System.String[] IdentifyingDescriptions {get;set;}
InstallDate                   Property      System.String InstallDate {get;set;}
Name                          Property      System.String Name {get;set;}
NameFormat                    Property      System.String NameFormat {get;set;}
OnTimeInMilliseconds          Property      System.UInt64 OnTimeInMilliseconds {get;set;}
OperationalStatus             Property      System.UInt16[] OperationalStatus {get;set;}
OtherDedicatedDescriptions    Property      System.String[] OtherDedicatedDescriptions {get;set;}
OtherEnabledState             Property      System.String OtherEnabledState {get;set;}
OtherIdentifyingInfo          Property      System.String[] OtherIdentifyingInfo {get;set;}
PowerManagementCapabilities   Property      System.UInt16[] PowerManagementCapabilities {get;set;}
PrimaryOwnerContact           Property      System.String PrimaryOwnerContact {get;set;}
PrimaryOwnerName              Property      System.String PrimaryOwnerName {get;set;}
ProcessID                     Property      System.UInt32 ProcessID {get;set;}
RequestedState                Property      System.UInt16 RequestedState {get;set;}
ResetCapability               Property      System.UInt16 ResetCapability {get;set;}
Roles                         Property      System.String[] Roles {get;set;}
Status                        Property      System.String Status {get;set;}
StatusDescriptions            Property      System.String[] StatusDescriptions {get;set;}
TimeOfLastConfigurationChange Property      System.String TimeOfLastConfigurationChange {get;set;}
TimeOfLastStateChange         Property      System.String TimeOfLastStateChange {get;set;}
__CLASS                       Property      System.String __CLASS {get;set;}
__DERIVATION                  Property      System.String[] __DERIVATION {get;set;}
__DYNASTY                     Property      System.String __DYNASTY {get;set;}
__GENUS                       Property      System.Int32 __GENUS {get;set;}
__NAMESPACE                   Property      System.String __NAMESPACE {get;set;}
__PATH                        Property      System.String __PATH {get;set;}
__PROPERTY_COUNT              Property      System.Int32 __PROPERTY_COUNT {get;set;}
__RELPATH                     Property      System.String __RELPATH {get;set;}
__SERVER                      Property      System.String __SERVER {get;set;}
__SUPERCLASS                  Property      System.String __SUPERCLASS {get;set;}
ConvertFromDateTime           ScriptMethod  System.Object ConvertFromDateTime();
ConvertToDateTime             ScriptMethod  System.Object ConvertToDateTime();


PS C:\CVS\IteExtensionCode\Virtualization\VirtualizationTest\Tools\Virtualization\Hyper-V\W2K8> .\GetVM.ps1 -vmName 'ITE*'

Host                      VMElementName             State        Up-Time (mS) Owner
--------                  -------------             -----        ------------ -----
T06CORE                   ITE                       Stopped      0
T06CORE                   ITE2                      Stopped      0
4

1 に答える 1

3

PSObject文字列をラッピングしているようです:これは正しいように見えます(out-string使用している場合)。PSObjectプロパティを使用してから文字列を抽出する必要がありBaseObject5ます。

返されるオブジェクトのコレクションを期待している場合は、をGet-VM使用しないでくださいOut-String

于 2012-07-26T17:58:53.150 に答える