如何将对象从PowerShell返回到C#

时间:2012-07-26 15:57:01

标签: c# powershell virtualization hyper-v

我想将一个对象从PowerShell返回到C#,因此C#使用C#代码中的对象来调用任何方法并从对象中获取属性。

例如,我有一个PowerShell脚本,它使用来自pshyperv.codeplex.com的Hyper-V模块从主机获取VM。 (此GetVM.ps1只是返回对象的解释示例)。

一旦我从Execute()执行PowerShell脚本,然后它返回对象,我想从ttt()调用对象的任何方法。

  1. 是否有可能将对象从PowerShell返回到C#?
  2. 如果找到(PowerShell,C#),可以在我的示例代码中纠正错误吗?
  3. 的PowerShell

    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
    

1 个答案:

答案 0 :(得分:2)

看起来你有一个PSObject包裹一个字符串:看起来是正确的(给定你正在使用的out-string)。您需要从PSObject及其BaseObject5属性中提取字符串。

如果您期望Get-VM返回的对象集合,请不要使用Out-String