2012-12-14 101 views
4

已更新。我在Visual Studio 2010中使用C#/.Net 4.0創建了一個PowerShell 3.0 cmdlet。它工作正常。但cmdlet需要一段時間,我想添加一個進度條。如何在PowerShell C#cmdlet中使用WriteProgressCommand?

MSDN文檔在WriteProgressCommand上很模糊。這裏是鏈接:http://msdn.microsoft.com/en-us/library/microsoft.powershell.commands.writeprogresscommand.completed(v=vs.85).aspx

下面的代碼顯示了我想要做的。基本上在ProcessRecord()下做一些處理。然後每秒更新一次進度條。不知道如何顯示進度欄。幫幫我?

[System.Management.Automation.Cmdlet(System.Management.Automation.VerbsCommon.Get, "StatusBar")] 
public class GetStatusBarCommand : System.Management.Automation.PSCmdlet 
{ 
    /// <summary> 
    /// Provides a record-by-record processing functionality for the cmdlet. 
    /// </summary> 
    protected override void ProcessRecord() 
    { 
     WriteProgressCommand progress = new WriteProgressCommand(); 

     for (int i = 0; i < 60; i++) 
     { 
      System.Threading.Thread.Sleep(1000); 
      progress.PercentComplete = i; 
     } 

     progress.Completed = true; 
     this.WriteObject("Done."); 
     return; 
    } 
} 

// Commented out thanks to Graimer's answer 
// [System.Management.Automation.CmdletAttribute("Write", "Progress")] 
// public sealed class WriteProgressCommand : System.Management.Automation.PSCmdlet { } 

回答

5

我測試過的小命令,現在10分鐘開發和揣摩的進度如何工作的。我甚至無法添加WriteProgressCommand類(但後來我再次成爲編程小白)。我沒去工作,雖然是以下幾點:

protected override void ProcessRecord() 
     { 
     ProgressRecord myprogress = new ProgressRecord(1, "Testing", "Progress:"); 

      for (int i = 0; i < 100; i++) 
      { 
       myprogress.PercentComplete = i; 
       Thread.Sleep(100); 
       WriteProgress(myprogress); 
      } 

      WriteObject("Done."); 
     } 

ProgressRecord存儲進度清晰度和你調用一個WriteProgress命令來更新與最新更新progressdata殼(PowerShell窗口)。構造函數中的「1」只是一個id。

+0

Hrm。所以我原來的代碼被破壞了,因爲我把WriteProgressCommand作爲公共密封類。我把它拿出來,突然出現了PercentComplete屬性。這很酷。下一個問題:進度條沒有顯示出來。 –

+0

好的。我沒有在C#中試過它,所以不知道它在那裏如何工作。對我的「答案」進行一次更正。活動和狀態(「Progress:」)是必需的,至少當您直接在PowerShell中執行時。因此,如果您還沒有,請嘗試包括活動/「主要目標」。 –

+0

WriteProgressCommand progress = new WriteProgressCommand(); progress.Activity =「正在運行......」; progress.Status =「跑步......」; //仍然沒有進度條。真奇怪。 –

相關問題