首页 > 解决方案 > 在 C# 中创建和使用 PowerShell 对象引用

问题描述

我需要实例化一个新对象并将其传递给这样的命令输入:

using (var pipeline = runspace.CreatePipeline())
{
    // Create configuration object
    pipeline.Commands.AddScript(
        "$eap = New-EapConfiguration -UseWinlogonCredential");

    var cmd = new Command("Add-VpnConnection");
    // Set connection settings...
    cmd.Parameters.Add(new CommandParameter(
        "EapConfigXmlStream", "$eap.EapConfigXmlStream"));

    pipeline.Commands.Add(cmd);
    pipeline.Invoke();
}

结果:

无法在“System.Xml.XmlDocument”对象类型中转换“$eap.EapConfigXmlStream”...

$eap.EapConfigXmlStream被解释为string,而不是对象引用

欢迎任何建议


编辑:

@JohnB:这个 PS 命令有效:

Set-VpnConnection -Name "MyVpnConnection"
    -EapConfigXmlStream (New-EapConfiguration -UseWinlogonCredential).EapConfigXmlStream

但是这个 C# 替换不起作用:

cmd.Parameters.Add(new CommandParameter("EapConfigXmlStream",
    "(New-EapConfiguration -UseWinlogonCredential).EapConfigXmlStream"));

(New-EapConfiguration -UseWinlogonCredential).EapConfigXmlStream解释为string

标签: c#powershell

解决方案


它应该像这样工作。 CommandParameter(String, Object)需要一个对象,但您传递了一个字符串"EapConfigXmlStream", "$eap.EapConfigXmlStream"

而是传递一个 PSObject:

    Runspace runspace = RunspaceFactory.CreateRunspace();
    runspace.Open();
    Collection<PSObject> configXML;

    using (var pipeline = runspace.CreatePipeline())
    {
        pipeline.Commands.AddScript(
            "(New-EapConfiguration -UseWinlogonCredential).EapConfigXmlStream");
        configXML = pipeline.Invoke();
    }

    using (var pipeline = runspace.CreatePipeline())
    {
        var cmd = new Command("Add-VpnConnection");
        cmd.Parameters.Add(new CommandParameter(
            "EapConfigXmlStream", configXML[0]));
        pipeline.Commands.Add(cmd);
        pipeline.Invoke();
    }

推荐阅读