我想将一个对象从PowerShell返回到C#,因此C#使用C#代码中的对象来调用任何方法并从对象中获取属性。
例如,我有一个PowerShell脚本,它使用来自pshyperv.codeplex.com的Hyper-V模块从主机获取VM。 (此GetVM.ps1只是返回对象的解释示例)。
一旦我从Execute()执行PowerShell脚本,然后它返回对象,我想从ttt()调用对象的任何方法。
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"}
}
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;
}
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
答案 0 :(得分:2)
看起来你有一个PSObject
包裹一个字符串:看起来是正确的(给定你正在使用的out-string
)。您需要从PSObject
及其BaseObject5
属性中提取字符串。
如果您期望Get-VM
返回的对象集合,请不要使用Out-String
。