1

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

例如,我有一个 PowerShell 脚本,它使用来自pshyperv.codeplex.com的 Hyper-V 模块从主机获取虚拟机。(这个 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 回答