1. 使用Xaml創建應用界面
打開visual studio,創建一個新的項目,在已安裝模板中選擇Visual C# →Wpf應用。
完成創建后,我們得到如下圖所示的應用界面。
wpf界面是基於xaml語言設計的,但是無需學習xaml,也可以用工具箱中的各種控件拖拽出不錯的布局(就像拖拽winform的控件一樣)。再配合屬性面板,修改各個控件的屬性,很容易就得到一個還看得過去的GUI界面。
保存項目。在項目的目錄下找到MainWindows.xaml,將其復制一份,這個xaml文件將會成為powershell腳本應用的GUI布局文件。
## 2. 編寫powershell腳本
新建powershell腳本。
首先引用wpf framework/core程序集,使得powershell腳本具備創建wpf應用的能力。
Add-type -AssemblyName presentationframework, presentationcore
接着創建wpf對象。
$wpf = @{ }
在腳本中讀入xaml文件
$x = Split-Path -Parent $MyInvocation.MyCommand.Definition $path = $x + ".\MainWindow.xaml" $inputXAML = Get-Content -Path $path $inputCleanXAML = $inputXAML -replace 'mc:Ignorable="d"','' -replace "x:N",'N' -replace 'x:Class=".*?"','' -replace 'd:DesignHeight="\d*?"','' -replace 'd:DesignWidth="\d*?"',''
幾個說明:
$x是該powershell腳本所在文件夾的絕對路徑,我將MainWindows.xaml放在與powershell腳本同級的文件夾下,使用 $MyInvocation.MyCommand.Definition獲取當前運行腳本所在路徑, Split-Path -Parent $MyInvocation.MyCommand.Definition即可獲得當前運行腳本所在的文件夾路徑。
由於powershell只支持對xml的解析,所以需要對xaml稍微修改一下,使用-replace批量替換掉多余的字符。
$inputCleanXAML = $inputXAML -replace 'mc:Ignorable="d"','' -replace "x:N",'N' -replace 'x:Class=".*?"','' -replace 'd:DesignHeight="\d*?"','' -replace 'd:DesignWidth="\d*?"',''
所有的xaml文件都可以使用這條語句來替換成xml。
緊接着使用xmlReader解析xml,創建窗體。
[xml]$xaml = $inputCleanXAML $reader = New-Object System.Xml.XmlNodeReader $xaml $tempform = [Windows.Markup.XamlReader]::Load($reader)
遍歷完xml的節點后,調用$wpf.MainWindow.ShowDialog()就可以顯示GUI窗體了。
此時我們點擊窗體的按鈕,窗體還不會有反應,接下來添加交互邏輯。
添加如下語句
$wpf.Confirm.add_Click({ #TODO... })
(在塊內添加單擊按鈕時你所需要執行的邏輯。)
注意:我在創建wpf引用界面時,創建了一個名為“Confirm”的按鈕,所以這里的add_Click({})對應的就是該按鈕的點擊時引發的事件。
保存powershell腳本文件,點擊運行,我們即可以得到一個GUI程序了,如下圖:
這個powershell腳本是我寫的一個文本解析器,先點擊More...按鈕打開文件選擇框,選擇一個*.mod的文本文件,然后點擊確定生成按鈕獲得變量列表--一個csv文件。
你可以在*https://github.com/Afuness/PowershellLab/tree/master/GUI*獲取源代碼。