【问题标题】:C++-CLI Pipeline only returns the first row of the error messageC++-CLI Pipeline 只返回错误信息的第一行
【发布时间】:2014-04-24 05:51:11
【问题描述】:

我正在通过我的代码中的管道执行交换 powershell 命令。

问题是当命令直接在powershell上执行时,返回的错误是四行长,但是当我通过管道运行命令时,它只返回错误消息的第一行。

这是我目前的代码:

bool ps_calls::check_invoke(Pipeline^ pipeline)
{
    if (pipeline->Error->Count <= 0)
        return true;

    Collection<System::Object^> errorCollection =  pipeline->Error->ReadToEnd();
    for (int i=0; i< errorCollection.Count; i++)
    {
        String^ msg = String::Format("Error {0}",errorCollection[i]->ToString());
        m_errors->Add(msg);
        m_logger->info_msg(String::Format("ERROR: {0}", msg));
    }

    return false;
}

这是我的管道现在返回的示例:

ERROR: Error The operation couldn't be performed because object 'Testing' couldn't be found on 'server'.

这是一个示例,如果在 powershell 控制台上手动执行相同的命令,则会出现错误消息:

The operation couldn't be performed because object 'test' couldn't be found on 'server'.

    + CategoryInfo          : NotSpecified: (:) [Get-MailboxDatabase], ManagementObjectNotFoundException

    + FullyQualifiedErrorId : 2F753561,Microsoft.Exchange.Management.SystemConfigurationTasks.GetMailboxDatabase

    + PSComputerName        : server

我也希望能够获取此错误消息的其余部分,以便在发生错误时看到 ErrorID。

【问题讨论】:

    标签: c++ powershell c++-cli


    【解决方案1】:

    PowerShell 在进行格式化时不会调用 ToString,这就是为什么您看不到相同的输出。

    一些主机应用程序通常将输出通过管道传输到 Out-Default - 如果您这样做,您会看到预期的错误格式。

    其他主机应用程序会将输出通过管道传输到 Out-String - 这将以与通过管道传输到 Out-Default 时的格式化方式相同的方式格式化对象,但是您将获得一个字符串对象,您可以根据需要记录该对象.

    【讨论】:

    • 所以您是说我应该将管道输出从 Out-String 更改为 Out-Default?但是我可以记录 Out-Default 返回的格式吗?我现在不在办公室,但明天早上第一件事会试试这个。谢谢。
    • 视情况而定,任何一种都可能适合您。您可以将调用 'errorCollection[i]->ToString()' 替换为通过管道将 errorCollection[i] 传递到 Out-String 的管道。如果您的 m_logger 连接到主机 (PSHost),则 Out-Default 可能没问题。
    • 嗨,杰森,感谢您的帮助。我试过只添加 pipeline->Commands->Add("Out-String");在执行调用命令之前,它仍然返回相同的输出。我是否必须专门将 errorCollection[i]->ToString() 更改为输出到 out-string 的管道,还是我做了等效的操作?不幸的是,m_logger 没有连接到主机,而只是连接到一个类。
    • 这可行,但是您需要合并错误和输出流,此时您只能通过现在知道哪些是错误的方式获取字符串。我建议为您的错误对象创建一个新的管道并将这些管道传输到 Out-String。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多