🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
textbox

HTMLの<input type="text">で生成されるtextboxに関するタグです。

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

Q&A

1回答

4510閲覧

Powershellで コマンド結果をTextboxへリアルタイムに出力したい

Leica

総合スコア0

textbox

HTMLの<input type="text">で生成されるtextboxに関するタグです。

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

0グッド

0クリップ

投稿2021/03/12 10:27

前提・実現したいこと

Powershell で 簡易的なGUIツールを作成しています。
例にPingを実行して、結果をTextboxに出力するスクリプトを載せます。

このプログラムでも Ping の結果を Textbox に出力を行えるのですが、最終的な結果のみの反映のようです。
これをリアルタイムに反映(cmdで実行したときのような)させるにはどのようにすればよろしいのでしょうか?
ご教授願えればと思います。

該当のソースコード

[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")

$Form = New-Object System.Windows.Forms.Form
$Form.Size = New-Object System.Drawing.Size(600,400)
$Form.Text = "PINGツール"

$InputBox = New-Object System.Windows.Forms.TextBox
$InputBox.Location = New-Object System.Drawing.Size(10,60)
$InputBox.Size = New-Object System.Drawing.Size(150,20)
$Form.Controls.Add($InputBox)

$OutputBox = New-Object System.Windows.Forms.TextBox
$OutputBox.Location = New-Object System.Drawing.Size(10,150)
$OutputBox.Size = New-Object System.Drawing.Size(490,180)
$OutputBox.MultiLine = $True
$OutputBox.ScrollBars = "Vertical"
$Form.Controls.Add($outputBox)

$Font = New-Object System.Drawing.Font("MS ゴシック",11)
$Label = New-Object System.Windows.Forms.Label
$Label.Location = New-Object System.Drawing.Point(10,30)
$Label.Size = New-Object System.Drawing.Size(500,20)
$Label.Text = "マシン名を入力して[PING]ボタンを押ください。"
$Label.Forecolor = #000
$Label.Font = $Font
$Form.Controls.Add($label)

$Button = New-Object System.Windows.Forms.Button
$Button.Location = New-Object System.Drawing.Size(390,60)
$Button.Size = New-Object System.Drawing.Size(110,80)
$Button.Text = "Action"
$Button.Add_Click({})
$Form.Controls.Add($Button)

function pingInfo {

$machineName = $InputBox.Text $pingResult = ping $machineName | Format-List | Out-String $outputBox.Text = $pingResult

}

$Button.Add_Click({pingInfo})

$Form.Add_Shown({$Form.Activate()})
[void] $Form.ShowDialog()

補足情報(FW/ツールのバージョンなど)

下記サイトのプログラムを拝借しております
https://soma-engineering.com/coding/powershell/make-ping-window/2018/08/04/

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

c#的には別プロセスからの$OutputBoxへのアクセスはInvokeが要るのに[ScriptBlock]からアクセス可能。$PID調べたら同じでした。その代わりというか、BeginOutputReadLine()以降に?な処理を入れないとうまく動きませんでした。この辺り私もよくわかっていません。(とりあえず動いてるプロトタイプとして見ていただければ m(__)m)

以下コードを追加して、
$Button.Add_Click({pingInfo_Realtime})
で動かしてみてください。

Powershell

1function pingInfo_Realtime { 2 $Process = New-Object Diagnostics.Process 3 $Process.StartInfo = New-Object Diagnostics.ProcessStartInfo("ping", $InputBox.Text); 4 $Process.StartInfo.CreateNoWindow = $TRUE 5 $Process.StartInfo.UseShellExecute = $FALSE 6 $Process.StartInfo.RedirectStandardOutput = $TRUE 7 $ROE = Register-ObjectEvent -InputObject $Process -Action $ScriptBlock -EventName 'OutputDataReceived' 8 $Process.Start() 9 $Process.BeginOutputReadLine() 10 #ここで終わりにしたいが....それだと動かない orz 11 while (!$Process.HasExited) { 12 Start-Sleep -m 100 13 $OutputBox.Refresh() 14 } 15 Unregister-Event -SourceIdentifier $ROE.Name 16 $InputBox.Focus() 17} 18[ScriptBlock]$ScriptBlock = { 19 $OutputBox.AppendText($EventArgs.Data + "`r`n") 20}

投稿2021/03/13 11:00

FromMZ1500

総合スコア496

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問