1

C# asp.net Web ページを使用して、サーバーで .ps1 PowerShell ファイルを実行しようとしています。このスクリプトは 1 つのパラメーターを取り、サーバー上のコマンド プロンプトを使用して動作することを確認しました。実行後、Web ページに結果を表示する必要があります。

現在、私は使用しています:

protected void btnClickCmdLine(object sender, EventArgs e)
{
    lblResults.Text = "Please wait...";
    try
    {
        string tempGETCMD = null;
        Process CMDprocess = new Process();
        System.Diagnostics.ProcessStartInfo StartInfo = new System.Diagnostics.ProcessStartInfo();
        StartInfo.FileName = "cmd"; //starts cmd window
        StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
        StartInfo.CreateNoWindow = true;
        StartInfo.RedirectStandardInput = true;
        StartInfo.RedirectStandardOutput = true;
        StartInfo.UseShellExecute = false; //required to redirect
        CMDprocess.StartInfo = StartInfo;
        CMDprocess.Start();
        lblResults.Text = "Starting....";
        System.IO.StreamReader SR = CMDprocess.StandardOutput;
        System.IO.StreamWriter SW = CMDprocess.StandardInput;
        SW.WriteLine("@echo on");

        SW.WriteLine("cd C:\\Tools\\PowerShell\\");

       SW.WriteLine("powershell .\\poweron.ps1 **parameter**");

        SW.WriteLine("exit"); //exits command prompt window
        tempGETCMD = SR.ReadToEnd(); //returns results of the command window
        lblResults.Text = tempGETCMD;
        SW.Close();
        SR.Close();
    }
    catch (Exception ex)
    {
        lblErrorMEssage.Text = ex.ToString();
        showError();
    }
}

ただし、powershell を呼び出す行を含めると、最初の「お待ちください..」も表示されません。ScriptManager で AsyncPostBackTimeout を増やしたとしても、最終的にはタイムアウトになります。誰が私が間違っているのか教えてもらえますか? ありがとう

4

3 に答える 3

0

これを試してみたところ、完了する前に標準入力をフラッシュまたはクローズする必要があることがわかりましたSR.ReadToEnd()。これを試して:

    lblResults.Text = "Please wait...";
    try
    {
        string tempGETCMD = null;
        Process CMDprocess = new Process();
        System.Diagnostics.ProcessStartInfo StartInfo = new System.Diagnostics.ProcessStartInfo();
        StartInfo.FileName = "cmd"; //starts cmd window
        StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
        StartInfo.CreateNoWindow = true;
        StartInfo.RedirectStandardInput = true;
        StartInfo.RedirectStandardOutput = true;
        StartInfo.UseShellExecute = false; //required to redirect
        CMDprocess.StartInfo = StartInfo;
        CMDprocess.Start();
        lblResults.Text = "Starting....";
        using (System.IO.StreamReader SR = CMDprocess.StandardOutput)
        {
            using (System.IO.StreamWriter SW = CMDprocess.StandardInput)
            {
                SW.WriteLine("@echo on");
                SW.WriteLine("cd C:\\Tools\\PowerShell\\");
                SW.WriteLine("powershell .\\poweron.ps1 **parameter**");
                SW.WriteLine("exit"); //exits command prompt window
            }
            tempGETCMD = SR.ReadToEnd(); //returns results of the command window
        }
        lblResults.Text = tempGETCMD;
    }
    catch (Exception ex)
    {
        lblErrorMessage.Text = ex.ToString();
        showError();
    }
}
于 2012-10-26T21:13:37.060 に答える
0

セキュリティ上の理由から、このように aspx ページから直接 powershell スクリプトを実行することはできないと思います。出力を実行してキャプチャするには:

  1. リモート実行空間を作成します: http://social.msdn.microsoft.com/Forums/hu/sharepointgeneralprevious/thread/88b11fe3-c218-49a3-ac4b-d1a04939980c http://msdn.microsoft.com/en-us/library/ Windows/デスクトップ/ee706560%28v=vs.85%29.aspx

  2. PSHost: Pipeline.Invoke スロー後に C# で Powershell 出力をキャプチャする

1は私にとって非常にうまく機能します。

ところで、イベントが終了していないため、ラベルは更新されません。PowerShell の待機中にラベルを表示するには、ajax を使用する必要がある場合があります。

于 2012-10-26T21:01:59.300 に答える