3

オブジェクトを出力するカスタムC#PowerShellコマンドレットを作成しました。

[Cmdlet(VerbsCommon.Get, "CustomObj")]
public class CustomObjGet : Cmdlet
{
    protected override void ProcessRecord()
    {
        var instance = CustomObj.Get();
        WriteObject(instance);
    }
}

使用法:

$output = Get-CustomObj

返されるオブジェクトには次のメソッドがあります。

public class CustomObj
{
    public string Name { get; set; }

    public static CustomObj Get()
    {
        var instance = new CustomObj() { Name = "Testing" };
        return instance;
    }

    public void RestartServices () 
    {
        // Want to WriteProgress here...
    }
}

使用法:

$output.RestartServices()

現在のところ、そのメソッドは、Cmdlet自体のProcessRecord()メソッドの場合のように、CmdletWriteProgress関数にアクセスできません。

そのメソッド内からPowerShellWriteProgressを実行したいと思います。どうすればそれができるかについてのアイデアはありますか?

4

1 に答える 1

4

申し訳ありませんが、質問を読み間違えました。これは私の限られたテストで機能するようです:

    public void RestartServices()
    {
        //Write
        // Want to WriteProgress here...
        for (int i = 0; i <= 100; i += 10)
        {
            Console.WriteLine("i is " + i);
            UpdateProgress(i);
            Thread.Sleep(500);
        }
    }

    private void UpdateProgress(int percentComplete)
    {
        var runspace = Runspace.DefaultRunspace;
        var pipeline = runspace.CreateNestedPipeline("Write-Progress -Act foo -status bar -percentComplete " + percentComplete, false);
        pipeline.Invoke();
    }

参考までに、PowerShell V3では、次のようにすることもできます。

    private void UpdateProgressV3(int percentComplete)
    {
        Collection<PSHost> host = PowerShell.Create(RunspaceMode.CurrentRunspace).AddCommand("Get-Variable").AddParameter("-ValueOnly").AddArgument("Host").Invoke<PSHost>();
        PSHostUserInterface ui = host[0].UI;
        var progressRecord = new ProgressRecord(1, "REstarting services", String.Format("{0}% Complete", percentComplete));
        progressRecord.PercentComplete = percentComplete;
        ui.WriteProgress(1, progressRecord);
    }
于 2012-08-20T23:25:44.727 に答える