1

メールをあるアカウントから別のアカウントに移動する Exchange Powershell スクリプトがあります。Powershell を介してコードを呼び出すと、リアルタイムのデータ統計が提供されます。それをキャプチャして、その「ライブフィード」を提供するテキストボックスにフィードするにはどうすればよいですか。ご協力いただきありがとうございます。

    public void RunPowerShell()
    {            
        Cursor.Current = Cursors.WaitCursor;
        RunspaceConfiguration rsConfig = RunspaceConfiguration.Create();
        PSSnapInException snapInException = null;
        Runspace runSpace;

        //create the runspace
        runSpace = RunspaceFactory.CreateRunspace(rsConfig);

        //insert try here
        runSpace.Open();

        //for exchange 2010 use "Microsoft.Exchange.Management.PowerShell.E2010"
        rsConfig.AddPSSnapIn("Microsoft.Exchange.Management.PowerShell.Admin", out snapInException);

        //set up the pipeline to run the powershell command 
        Pipeline pipeLine = runSpace.CreatePipeline();

        //create the scripts to use
        String sScript = "Add-MailboxPermission -Identity " + FromEmailAccount.Text + " -User Administrator -AccessRights FullAccess";
        String sScript1 = "Add-MailboxPermission -Identity " + ToEmailAccount.Text + " -User Administrator -AccessRights FullAccess";
        String sScript2 = "Export-Mailbox -Identity " + FromEmailAccount.Text + " -TargetMailbox " + ToEmailAccount.Text + " -TargetFolder " + FromEmailAccount.Text + " -Confirm:$false";

        //invoke the scripts
        pipeLine.Commands.AddScript(sScript);
        pipeLine.Commands.AddScript(sScript1);
        pipeLine.Commands.AddScript(sScript2);

        Collection<PSObject> commandResults = pipeLine.Invoke();

        //loop through the results of the command and load the ?
        foreach (PSObject results in commandResults)
        {
            richTextBox1.Text = results.ToString();
            //MessageBox.Show(results.Properties["DisplayName"].Value.ToString(),@"Name");
        }

        //close the pipelin and runspace
        pipeLine.Dispose();
        runSpace.Close();

        //create completed message
        MessageBox.Show(@"Email migration is complete", @"Done");
        Cursor.Current = Cursors.Default;
    }
4

1 に答える 1

1

ラインの後

pipeLine.Commands.AddScript(sScript2);

追加してみる

pipeLine.Commands.Add("out-string");

すべての出力 (PSObjects) を受け取り、それらを文字列に変換すると思います。TextBox で解析して表示する方が簡単かもしれません。

GUI を更新する方法の例を次に示します。変数で、scriptText2 つの PowerShell 関数を定義します。メールボックスのエクスポートを開始するコードを持つように、最初の関数を変更する必要があります。次に、2 番目の関数を変更して、エクスポートを照会し、それが何パーセント行われたかを調べます。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Management.Automation;
using System.Collections.ObjectModel;
using System.Management.Automation.Runspaces;
using System.Threading;
using System.ComponentModel;

namespace PowerShellLiveUpdateExample
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private BackgroundWorker bw = new BackgroundWorker();

        public MainWindow()
        {
            InitializeComponent();

            // Setup the BackgroundWorker
            bw.WorkerReportsProgress = true;
            bw.WorkerSupportsCancellation = true;
            bw.DoWork += new DoWorkEventHandler(bw_DoWork);
            bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
            bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            if (bw.IsBusy != true)
            {
                bw.RunWorkerAsync();
            }
        }

        private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            textbox1.Text = (e.ProgressPercentage.ToString() + " %");
        }

        private void bw_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker worker = sender as BackgroundWorker;

            string scriptText = @"
                function startExport() {
                    $script:finishtime = (get-date).addminutes(1)
                }

                function getPercentDone() {
                    $timeleft = new-timespan $(get-date) $finishtime
                    return [math]::truncate(100 - ($timeleft.totalseconds / 60) * 100)
                }

                startExport";

            PowerShell psExec = PowerShell.Create();
            psExec.AddScript(scriptText);

            // Start the export
            psExec.Invoke();

            // Flush the currently added commands
            psExec.Commands.Clear();

            Collection<PSObject> results;
            Collection<ErrorRecord> errors;
            int percent = 0;

            // Report on the export
            while (percent < 100)
            {
                // Update every second
                Thread.Sleep(1000);

                psExec.AddScript("getPercentDone | out-string");
                results = psExec.Invoke();
                errors = psExec.Streams.Error.ReadAll();

                foreach (PSObject obj in results)
                {
                    Int32.TryParse(obj.ToString(), out percent);
                    worker.ReportProgress(percent);
                }
            }
        }

        private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if ((e.Cancelled == true))
            {
                textbox1.Text = "Canceled!";
            }
            else if (!(e.Error == null))
            {
                textbox1.Text = ("Error: " + e.Error.Message);
            }
            else
            {
                textbox1.Text = "Done!";
            }
        }

    }
}

PowerShell コードを次のように変更する必要があると思います。

function startExport() {
    $script:exportid = new-mailboxexportrequest -mailbox "John Doe" -filepath  '\\fileshare\john.doe.pst' -baditemlimit $baditemlimit
    # Give the export some time to get settled
    start-sleep 10
}

function getPercentDone() {
    $export = get-mailboxexportrequest $script:exportid
    $exportstats = $export | get-mailboxexportrequeststatistics
    return $exportstats.PercentComplete
}

しかし、私はそれをテストしていません。

于 2012-07-03T20:21:43.490 に答える