如何在C#中跟踪Powershell的进度和错误?

克里斯蒂安

我目前正在编写一个WPF应用程序,该应用程序允许用户转换

.vmdk(VMware vm文件)

到一个

.vhdx(Hyper-V vm文件)。

我正在使用一个cmdlet(ConvertTo-MvmcVirtualHardDisk),该cmdlet驻留在MvmcCmdlet.psd1模块随附

Microsoft虚拟机转换器3.0.0

我正在使用硬编码路径atm测试功能。

这是我当前的代码:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Management.Automation;
using System.Management.Automation.Runspaces;
using System.Threading;
using System.Windows;

namespace PowershellTestArea
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    private string output { get; set; }

    public MainWindow()
    {
        InitializeComponent();
    }

    private void Button_OnClick(object sender, RoutedEventArgs e)
    {
        new Thread(() =>
        {
            Runspace rs = RunspaceFactory.CreateRunspace();
            rs.ThreadOptions = PSThreadOptions.UseCurrentThread;
            rs.Open();

            PowerShell ps = PowerShell.Create();

            ps.Runspace = rs;

            ps.AddCommand("Import-Module", true).AddParameter("Name", @"C:\Program Files\Microsoft Virtual Machine Converter\MvmcCmdlet.psd1");
            ps.Invoke();

            Debug.WriteLine(ps.HadErrors);

            Thread.Sleep(3000);

            ps.AddCommand("ConvertTo-MvmcVirtualHardDisk")
            .AddParameter("–SourceLiteralPath", @"'C:\VM\Windows 7 x64.vmdk'")
            .AddParameter("-VhdFormat", "Vhdx");
            Debug.WriteLine(ps.HadErrors);
            ps.BeginInvoke();

            IAsyncResult asyncResult = ps.BeginInvoke<PSObject, PSObject>(null, output);

            while (!asyncResult.IsCompleted)
            {
                Debug.WriteLine("Running...");
            }

            Debug.WriteLine(ps.Streams.Error.ToString());

            rs.Close();

        }).Start();
    }
}
}

我在新线程中执行Powershell代码的原因是,该模块已导入并且可以在运行时使用。可以这么说,我想确保它是在同一会话中导入的。流程:

ps.AddCommand("ConvertTo-MvmcVirtualHardDisk")
            .AddParameter("–SourceLiteralPath", @"'C:\VM\Windows 7 x64.vmdk'")
            .AddParameter("-VhdFormat", "Vhdx");
            Debug.WriteLine(ps.HadErrors);
            ps.BeginInvoke();

完成非常快(HadErrors返回false),并且在powershell中运行时,大约需要40分钟才能完成。

谁能告诉我该怎么做,以跟踪进度,以便可以完成/完成转换?

编辑:

该问题的不同之处在于,我的过程无法正确完成,并且我想知道如何给该过程时间来完成。

帕纳吉奥提斯·卡纳沃斯(Panagiotis Kanavos)

Powershell中的Progress是一个流,就像Error,Warning,Debug等一样。所有流都可以通过PSDataStreams类(通过Powershell.Streams属性公开)来使用

您可以通过订阅事件在Progress流上侦听ProgressDataAdded事件,例如:

ps.Streams.Progress.DataAdded += (sender,args) => {
    var records = (PSDataCollection<ProgressRecord>)sender;
    var current=records[args.Index];
    Console.WriteLine("VM conversion is {0} percent complete", current.PercentComplete);
};

您可以用类似的方式收听其余的流,例如Errors流ErrorRecord对象的集合您可以以相同的方式收听信息,详​​细消息,警告消息,以构造发生的事件的完整日志。

另一个选择是创建Powershell会话成绩单从您调用Start-Transcript到调用Stop-Transcript的那一刻,这会将所有命令和会话的输出保存到文本文件,例如:

Start-Transcript -OutputDirectory 'c:\mylogs' -noclobber -IncludeInvocationHeader

ConvertTo-MvmcVirtualHardDisk ...

Stop-Transcript

或使用C#的等效代码。

这是一种捕获所有内容以进行故障排除的快捷方法

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在GWT中跟踪JSNI错误?

来自分类Dev

如何在 C# 控制台应用程序中跟踪用户输入?

来自分类Dev

在Windows中,如何在C中跟踪子进程读取和写入的文件?

来自分类Dev

如何在并行包中的R中跟踪mclapply中的进度

来自分类Dev

Spark如何在randomSplit中跟踪拆分?

来自分类Dev

如何在MySQL中跟踪连接

来自分类Dev

如何在Eclipse中跟踪代码?

来自分类Dev

如何在MVC中跟踪先前的Urls

来自分类Dev

如何在piwik中跟踪搜索?

来自分类Dev

如何在git中跟踪.lnk文件?

来自分类Dev

如何在Django中跟踪页面导航

来自分类Dev

如何在AngularJS中跟踪事件?

来自分类Dev

如何在Delphi中跟踪点

来自分类Dev

如何在 Xcode 中跟踪多次触摸

来自分类Dev

如何在rails中跟踪用户来源?

来自分类Dev

如何在grequests中跟踪重定向?

来自分类Dev

在Windows窗体应用程序C#中跟踪用户和远程访问

来自分类Dev

如何在整个应用程序中跟踪用户的手势和点击?

来自分类Dev

Swift:如何在SpriteKit中跟踪和传达场景之间的分数

来自分类Dev

如何在Scala中跟踪嵌套期货的例外情况和结果

来自分类Dev

如何在C ++ 11 lambda中跟踪对象生存期?

来自分类Dev

如何在C#Webform中跟踪asp.net的按钮按下事件?

来自分类Dev

Stroustrup C ++书。如何在while循环中跟踪哪个整数输入最大和最小?

来自分类Dev

如何在Spring Boot中跟踪唯一的Web请求?

来自分类Dev

如何在flask登录中跟踪当前用户?

来自分类Dev

如何在Android的Firebase中跟踪侦听器?

来自分类Dev

如何在datagridview单元格中跟踪旧值?

来自分类Dev

如何在Ruby代码中跟踪内存泄漏?

来自分类Dev

如何在std :: stringstream中跟踪当前位置

Related 相关文章

热门标签

归档