在Windows 中以PowerShell 指令稿显示弹出式对话视窗,让使用者输入选项或文字。

问题

如何在PowerShell 中使用弹出式的对话视窗,通知或询问使用者,让使用者输入选项或文字?

解法

在PowerShell 中若要使用弹出式的对话视窗,最简单的做法就是透过Windows Script Host 来建立弹出式视窗,使用方式很简单,也支援大部分常见的对话方块形式。

如果想要自订特殊的对话视窗,则可以考虑采用Microsoft .NET Framework 的表单建立功能,以这种方式所建立视窗排版弹性非常高,不过需要撰写的程式码也比较多。

以下分别介绍这两种方式的使用方法,实务上可依照需求来决定采行的方式。

基本对话视窗

Windows Script Host

使用Windows Script Host 时,首先要建立一个WSH 的物件:

# 建立WSH 物件

接着使用 Popup

$wsh.Popup(問題內容, 等待秒數, 視窗標題, 按鈕與圖示代號)

其中問題內容就是視窗中主要的文字內容,而視窗標題則是對話視窗的文字標題內容。

等待秒數是指定等待使用者輸入的時間(單位為秒),如果視窗開啟之後,等待時間超過了這個設定值,視窗就會自動關閉。

按鈕與圖示代號是一個整數值,用來設定對話視窗上的按鈕與圖示組合,以下是各個數值所對應的按鈕組合:

數值 按鈕組合
0 確定(OK)
1 確定(OK)、取消(Cancel)
2 中止(Abort)、重試(Retry)、略過(Ignore)
3 是(Yes)、否(No)、取消(Cancel)
4 是(Yes)、否(No)
5 重試(Retry)、取消(Cancel)

以下是各個數值所代表的圖示:

數值 圖示
16 Critical
32 Question
48 Exclamation
64 Information

在選擇一組按鈕組合以及圖示之後,將對應的數值加起來,填入按鈕與圖示代號即可,以下是顯示「是」、「否」按鈕與「問題」圖示的對話視窗範例:

# 顯示彈出式對話視窗
$answer = $wsh.Popup("Office 好用嗎?", 5, "示範問題", 4 + 32)
彈出式對話視窗

Popup 的傳回值 $answer 是一個整數,各種數值所代表的意義如下:

傳回值 按下的按鈕
1 確定(OK)
2 取消(Cancel)
3 中止(Abort)
4 重試(Retry)
5 略過(Ignore)
6 是(Yes)
7 否(No)
-1 沒有按下任何按鈕(等候逾時)。

在使用者輸入之後,通常都會使用 Switch 來處理:

# 判斷使用者的輸入值
Switch ($answer) {
  6  { $msg = "好用!" }
  7  { $msg = "不好用!" }
  -1 { $msg = "使用者沒有回答。" }
}

# 以彈出式對話視窗顯示訊息
$answer = $wsh.Popup($msg)
彈出式對話視窗

自訂對話視窗

當 Windows Script Host 所建立的基本對話視窗無法滿足應用程式的需求時,就可以考慮使用進階的 Microsoft .NET Framework 自訂對話視窗,以下是一個簡單的範例:

# 使用 .NET Framework 的類別
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

# 建立表單視窗
$form = New-Object System.Windows.Forms.Form
# 設定視窗標題
$form.Text = 'Data Entry Form'
# 設定表單視窗大小
$form.Size = New-Object System.Drawing.Size(300,200)
# 設定視窗位置為 CenterScreen(螢幕中央)
$form.StartPosition = 'CenterScreen'

# 建立 OK 按鈕
$OKButton = New-Object System.Windows.Forms.Button
# 設定按鈕位置
$OKButton.Location = New-Object System.Drawing.Point(75,120)
# 設定按鈕大小
$OKButton.Size = New-Object System.Drawing.Size(75,23)
# 設定按鈕文字
$OKButton.Text = 'OK'
# 設定按下按鈕的傳回值
$OKButton.DialogResult = [System.Windows.Forms.DialogResult]::OK
# 將按鈕加入表單
$form.AcceptButton = $OKButton
$form.Controls.Add($OKButton)

# 建立 Cancel 按鈕
$CancelButton = New-Object System.Windows.Forms.Button
$CancelButton.Location = New-Object System.Drawing.Point(150,120)
$CancelButton.Size = New-Object System.Drawing.Size(75,23)
$CancelButton.Text = 'Cancel'
$CancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
$form.CancelButton = $CancelButton
$form.Controls.Add($CancelButton)

# 建立視窗中的說明文字
$label = New-Object System.Windows.Forms.Label
$label.Location = New-Object System.Drawing.Point(10,20)
$label.Size = New-Object System.Drawing.Size(280,20)
$label.Text = 'Please enter the information in the space below:'
$form.Controls.Add($label)

# 建立視窗中輸入資料用的文字方塊
$textBox = New-Object System.Windows.Forms.TextBox
$textBox.Location = New-Object System.Drawing.Point(10,40)
$textBox.Size = New-Object System.Drawing.Size(260,20)
$form.Controls.Add($textBox)

# 將視窗設定為最上層顯示
$form.Topmost = $true

# 啟動表單,並將滑鼠游標預設位置設定在文字方塊中
$form.Add_Shown({$textBox.Select()})

# 顯示表單視窗
$result = $form.ShowDialog()

# 检查按下的按钮,并取得使用者输入的文字
 
}

执行之后,产生的视窗如下:

自订对话视窗

参考资料:

Oh 游读者 👋
It’s nice to meet you.

每周三,您都将收到一封内容详实的Newsletter.

Oh 游读者 👋
It’s nice to meet you.

每周三,您都将收到一封内容详实的Newsletter.