2016-12-19 1 views
3

나는 현재 사용자가Powershell 진행 상황과 C#의 오류를 어떻게 추적합니까?

하여 .vmdk (VM웨어 VM 파일)을

.vhdx에

(하이퍼 V VM 변환 할 수있는 WPF 응용 프로그램을 쓰고 있어요 파일).

나는 cmdlet을

Microsoft 가상 머신 변환기 3.0.0

I와 함께 제공되는 MvmcCmdlet.psd1 모듈에있는 (를 ConvertTo-MvmcVirtualHardDisk)를 사용하고 있습니다 하드 코드 된 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(); 
    } 
} 
} 

이유 :

여기에 내 현재 코드입니다. 저는 그것이 동일한 세션에서 가져 오기 때문에 말하도록하고 싶습니다. 과정 :

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 분 정도 소요됩니다.

아무에게도 진행 상황을 추적하기 위해 수행 할 작업을 알 수 없으므로 변환을 완료 할 수 있습니까?

편집 :this question에서

차이 내 프로세스가 제대로 완료되지 않는다는 것입니다, 나는 과정을 완료 할 수있는 시간을 제공하십시오 방법에 대해 궁금하네요.

+0

문제 해결을 위해 모든 것을 신속하게 캡처 할 수 & 더러운 방법입니다. 'ConvertTo-MvmcVirtualHardDisk'는 진행 바를 표시합니까? 그렇다면 진행 스트림을 첨부하여 읽을 수 있습니다. –

+0

답변 해 주셔서 감사합니다. Powershell에서 실행할 때 진행 막대를 표시합니다. 이것을 달성하는 방법에 대해 안내 할 수 있습니까? – Kristian

+1

[이 질문] (http://stackoverflow.com/questions/34814719/reading-powershell-progress-bar-output-in-c-sharp)을 확인하십시오. 프로퍼티 스트림에서 이벤트를 수신하는 법을 보여줍니다. –

답변

0

진행률은 오류, 경고, 디버그 등과 같은 스트림입니다. 모든 스트림은 Powershell.Streams 속성을 통해 노출되는 PSDataStreams 클래스를 통해 사용할 수 있습니다.

당신의 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 개체의 정보, Verbose, 경고 메시지를 동일한 방식으로들을 수있어 일어난 일의 전체 로그를 구성 할 수 있습니다.

또 다른 옵션은 Powershell 세션의 Transcript을 만드는 것입니다.

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

ConvertTo-MvmcVirtualHardDisk ... 

Stop-Transcript 

또는 해당 코드를 사용하여 C 번호 : 당신은 예를 들어 정지 - 성적 증명서를 호출 할 때까지이를 시작 - 성적 증명서를 호출하는 순간부터 모든 명령과 텍스트 파일로 세션의 출력을 저장합니다.

는이 진행 그냥 오류와 같은 파이프 라인 스트림

+0

늦게 응답 해 주셔서 죄송합니다. 이 대답은 내 문제를 명확하게 해결했으며, 그냥 받아들이는 것을 잊었습니다. 고맙습니다! – Kristian

관련 문제