PowerShell 是一個命令行工具,但你知道它也可以作為圖形界面的基礎嗎?對於特定情況來說,有時命令行並不是最好的界面類型。為你的服務台構建一個 PowerShell GUI 就是一個很好的例子。在這種情況下,構建圖形工具比較合適。
Not a reader? Watch this related video.
在幫助台重置密碼時,強制進行最終用戶驗證。使用 Specops Secure Service Desk 減少你的社交工程風險。聯繫我們進行演示!
PowerShell 可以使用和公開 .NET 功能和特性。因此,可以為你創建的腳本編寫 GUI 前端。對於初學者來說,構建 PowerShell GUI 可能看起來很複雜。
但是,如果你有基本的 PowerShell 腳本編寫經驗,那麼你沒有理由不學習並適應創建腳本 GUI 的實踐。
在本文章中,你將學習如何使用 Windows Presentation Framework(WPF)創建一個 PowerShell GUI。
前提條件
在開始之前,請確保滿足以下要求:
- Visual Studio 2017 或更新版本 – 你將使用它來使用 WPF 創建圖形用戶界面。你可以下載一個免費/社區版本。
- A script editor – I use Visual Studio Code, but you can also use another text editor of your choice. Some other options are Notepad++ and the built-in PowerShell ISE
- A Windows 10 computer with Windows PowerShell 5.1.
建立腳本
在這篇文章中,您將建立一個名為Main.ps1的簡單腳本。在這個腳本中,您將編寫代碼,通過查詢Win32_LogicalDisk WMI 類別從本地或遠程系統中獲取磁盤信息。
您需要一個腳本來首先包裝一個圖形用戶界面。我選擇使用一個腳本,讓您可以提供計算機名稱並查詢磁盤信息。這絕對不是構建圖形用戶界面所必需的。在這篇文章中學到的技巧可以讓您將圖形用戶界面適應到自己的腳本中。
作為示例腳本,我將創建一個執行以下操作的函數:
- 接受輸入計算機名稱以查詢
- 查詢計算機並將固定磁盤信息存儲到變量中
- 返回結果
編寫函數
以下是您將在此項目中使用的函數,名為Get-FixedDisk
。此項目的目的是獲取目標機器上關於不可移動或固定磁盤的信息。
雖然這段代碼可以直接使用,但如果您只想執行快速查詢而不必每次都點擊源代碼和手動輸入命令,創建一個圖形用戶界面將是有益的。
你可以看到我在代碼中添加了 param() 區塊。這是為了通知函數根據指定的數據類型接受輸入。
在這個例子中,我添加了一個接受字符串值的 Computer
參數。同時,通過添加 Mandatory
參數屬性,確保在運行時未指定 Computer
參數時不執行該函數。
接下來,第18行顯示了實際的 WMI 查詢命令,獲取所有邏輯磁碟的列表並將結果保存到名為 $DiskInfo
的變量中。我還添加了一個過濾器,只獲取 DriveType=3
的磁碟。這個過濾器確保只顯示關於本地固定磁碟的信息。
導入代碼(點源碼)
在這一點上,您現在擁有一個可運行的腳本並準備進行測試。但在測試腳本之前,您需要將代碼導入到 PowerShell 會話中。導入代碼到 PowerShell 會話的一種方法是通過點源。
要點源一個腳本,請在腳本路徑之前輸入一個點(.
)和一個空格。如果腳本位於C:\PoshGUI-sample文件夾中,您可以像下面這樣點源它。
如果您不在當前工作目錄中,也可以指定完整路徑。在下面的示例代碼中,您可以看到腳本的完整路徑。
現在我們已經將代碼導入到內存中,我們可以繼續測試我們創建的函數。在下面的示例中,顯示了使用Get-FixedDisk
函數查詢計算機poshLabExc。
構建 PowerShell GUI
到目前為止,您已經創建了名為Main.ps1的腳本文件,在腳本內部創建了Get-FixedDisk
函數。您還能夠測試並確認該函數運行正常。
既然您知道腳本可以正常工作,您可以開始構建 GUI。
設計 PowerShell GUI 表單
首先計劃您希望 GUI 的外觀和要使用的元素。對於這個簡單的示例,我們的 GUI 將包含:
- a text box where the computer name can be entered
- a button to execute the function
- a text box where we can display the results
接下來,您可以開始構建它!
要開始創建 GUI,打開 Visual Studio,創建一個新項目。
打開Visual Studio後,點擊檔案(1) -> 新建(2) -> 專案(3)。

在新建專案窗口中,選擇Visual C#(1),選擇WPF應用程式(.NET Framework)(2),將名稱更改為PoshGUI-sample(3),然後點擊確定。

創建專案後,將顯示一個名為MainWindow.xaml的空白表單。

現在,您需要對此表單進行格式設置以滿足我們的要求。以下是您需要添加的控件和格式。
- 窗口
- 標題:磁碟信息
- 高度:326
- 寬度:403
- 控件(4個)
- 標籤
- 內容:“計算機名稱:”
- 邊距:10, 10, 0, 0
- 文本框
- 名稱:txtComputer
- 文本:“”
- 高度:23
- 寬度:174
- 按鈕
- 名稱:btnQuery
- 內容:查詢
- 邊距:0, 13, 12, 0
- 文本框
- 名稱:txtResults
- 文本:“”
- 只讀:True
- 邊距:10, 60, 0, 0
- 高度:225
- 寬度:373
- 標籤
表單的最終外觀應與下面的圖片類似。您可以以不同的方式重新排列視窗的佈局。請發揮創意!

結合腳本和PowerShell GUI
一旦您對設計滿意,現在可以開始將其與腳本集成。
PowerShell無法本地顯示表單。為了能夠顯示表單,我們需要在腳本的最頂部添加一行代碼來支持WPF表單的渲染。
然後添加代碼執行以下操作:
- 導入並讀取表單的XAML代碼。
- 動態創建變量並分配給每個命名控件
- 顯示表單
以下是您腳本中的更新代碼。
注意:請確保修改
$xamlFile
這行,將它指向您的 MainWindow.xaml 文件的完整路徑。
注意:
$Null = $window.ShowDialog()
必須始終是腳本內的最後一行代碼。
當您執行這段代碼,執行 Main.ps1 腳本時,您應該會看到下面的示例輸出。

如您所見,這三個命名控制項已被賦予它們的變量。這些變量名將在稍後的腳本中引用,當我們添加控制邏輯代碼時。
- var_btnQuery
- var_btnComputer
- var_txtResults
請記住,目前這個腳本只能顯示表單,但控制項是無效的,因為您尚未添加代碼。
添加按鈕點擊事件代碼
現在,您已成功修改腳本以導入和顯示GUI,開始添加代碼到控制項以檢索和顯示磁盤信息數據。
在這個項目中,只有btnQuery
按鈕會被指定一個動作。其他控制項只用作輸入和輸出/顯示控制項。這意味著我們只需要為btnQuery
添加一個click事件代碼。
要為btnQuery
添加click動作,將下面的代碼分配給其對應的變量名$var_btnQuery
。將下面的代碼複製並插入到腳本中Get-Variable var_*
和$Null = $window.ShowDialog()
代碼引用之間。
測試完成的PowerShell GUI
綜上所述,以下是我們設計的腳本的完整代碼,其中包括函數和PowerShell GUI。
如下所示,在PowerShell中調用腳本後,會出現PowerShell GUI窗口。然後,您可以輸入有效的計算機名稱來測試功能。

使用能夠消除用戶冒名頂替機會的身份驗證方法來安全驗證呼叫者。使用Specops Secure Service Desk阻止幫助台黑客。免費試用!
摘要
在本文中,您学习了如何创建一个简单的函数来接受输入并返回结果。您还学习了如何创建一个基本的WPF PowerShell GUI,以及如何导入它作为您创建的PowerShell脚本的前端。
这只是一个基本的脚本和GUI的组合。可以进行许多改进,例如:
- 将大小和可用空间格式化为GB值。
- 更改显示的属性名称。
- 使用GridView而不是TextBox显示结果。
- 添加一个导入按钮,以便从CSV文件中循环遍历服务器列表。
根据您的要求,您可以修改和添加功能。