編寫腳本的過程中有很多時候需要進行人機交互,比如我寫一個腳本,需要動態的輸入一些內容,比如用戶名和密碼之類的東西,這些是沒辦法事先寫進代碼里的。而通過外部文件進行信息讀取,友好性又差了點。所以當我們需要動態的用戶輸入信息時,一個這樣的表單真是必不可少。雖然這並不是PowerShell作為一個腳本語言的強項,但是任何具有特色的語言肯定都不是完美的,所以我們為了充分發揮腳本語言的靈活性,有時候也不得不為他的弱項買單。(其實也沒有太弱,如果VS中WinForm用的熟,這個原理也是一樣的,PowerShell做為一種腳本語言,和C#一樣是基於.NET框架的,所以類庫相通,很多特性都可以互聯。)
以下是我的代碼,實現一個動態交互表單:
<# Intro: This function will display a form to communicate with the user. Input: -FormText -ButtonText Example: MakeForm -FormText "ForInput" -ButtonText "Submit" Use: To make the PowerShell program's interactivity better. #> function MakeForm{ param($FormText,$ButtonText) $null = [Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") $form = New-Object Windows.Forms.Form $form.size = New-Object Drawing.Size -Arg 400,80 $form.StartPosition = "CenterScreen" $form.Text = $FormText.toString() $textBox = New-Object Windows.Forms.TextBox $textBox.Dock = "fill" $form.Controls.Add($textBox) $button = New-Object Windows.Forms.Button $button.Text = $ButtonText $button.Dock = "Bottom" $button.add_Click( {$global:resultText = $textBox.Text;$form.Close()}) $form.Controls.Add($button) [Void]$form.ShowDialog() }
使用方法如下:
MakeForm -FormText "What's your name" -ButtonText "Submit"
運行效果如下:
PS:用戶輸入的內容將存儲到變量$global:resultText中。(本質就是創建了一個WinForm窗體對象,並動態的賦予窗體標題和按鈕名稱。)