私は現在、ユーザーがPowershellの進行状況とエラーをC#でどのように追跡しますか?
.vhdx(Hyper-VのVMに
の.vmdk(VMwareの仮想マシンファイル)
に変換することができますWPFアプリケーションを書いていますファイル)。私は
マイクロソフトのVirtual Machineコンバータ3.0.0
が付属していますMvmcCmdlet.psd1モジュールに存在するコマンドレット(をConvertTo-MvmcVirtualHardDisk)を使用しています
ハードコードされたパスatmで機能をテストしています。モジュールがインポートされ、実行時に使用することができることを、私はがある新しいスレッドでPowerShellのコードをやっている
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();
}
}
}
理由:
は、ここに私の現在のコードです。私はそれが話すように、同じセッションでインポートされていることを確認したいと思います。 プロセス:
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分かかります。
誰でも私に何をすべきか教えてください。進行状況を追跡して、変換を完了/終了できますか?
EDIT:this questionから
違いは、私のプロセスが正常に終了しないということである、と私は、プロセスを終了する時間を与えるためにどのように思ったんだけど。
進捗状況だけでエラーのように、パイプラインストリームでのトラブルシューティングのためにすべてを捕獲するための迅速&汚い方法です。 'ConvertTo-MvmcVirtualHardDisk'はプログレスバーを表示しますか?はいの場合は、進行ストリームを添付して読むことができます –
あなたの答えをありがとう。 Powershellで実行するときにプログレスバーを表示します。あなたはこれを達成する方法について私を導くことができますか? – Kristian
[この質問](http://stackoverflow.com/questions/34814719/reading-powershell-progress-bar-output-in-c-sharp)をチェックしてください。プロパティストリーム上のイベントをリッスンする方法を示します –