2016-12-19 10 views
3

私は現在、ユーザーが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から

違いは、私のプロセスが正常に終了しないということである、と私は、プロセスを終了する時間を与えるためにどのように思ったんだけど。

+0

進捗状況だけでエラーのように、パイプラインストリームでのトラブルシューティングのためにすべてを捕獲するための迅速&汚い方法です。 'ConvertTo-MvmcVirtualHardDisk'はプログレスバーを表示しますか?はいの場合は、進行ストリームを添付して読むことができます –

+0

あなたの答えをありがとう。 Powershellで実行するときにプログレスバーを表示します。あなたはこれを達成する方法について私を導くことができますか? – Kristian

+1

[この質問](http://stackoverflow.com/questions/34814719/reading-powershell-progress-bar-output-in-c-sharp)をチェックしてください。プロパティストリーム上のイベントをリッスンする方法を示します –

答えて

0

進捗状況は、エラー、警告、デバッグなどと同じようにストリームです。すべてのストリームはPSDataStreamsクラスから利用でき、Powershell.Streamsプロパティで公開されています。

あなたは、DataAddedイベントにサブスクライブすることによって進捗ストリームの進捗状況イベントをリッスンすることができ、例えば:

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 streamコレクションですErrorRecordオブジェクトの起こったことの完全なログを構築するために、情報、冗長、警告メッセージを同じ方法で聴くことができます。

もう1つの方法は、PowershellセッションのTranscriptを作成することです。 C#を使用して

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

ConvertTo-MvmcVirtualHardDisk ... 

Stop-Transcript 

または同等のコード:これは、あなたがストップ・トランスクリプトを呼び出すまで、あなたは例えば、スタート・トランスクリプトを呼び出した瞬間から、テキストファイルにすべてのコマンドとセッションの出力を保存します。

これは

+0

遅刻して申し訳ありません。この回答は私の問題を明確に解決し、それを受け入れることを忘れてしまった。ありがとうございました! – Kristian

関連する問題