צור WPF PowerShell GUIs: פונקציות, קלטים, ותוצאות

פוורשל הוא כלי שורת פקודה אך הידעת שאפשר גם להשתמש בו כבסיס לממשקים גרפיים? לפעמים השימוש בשורת פקודה אינו הכי טוב לסוג מסוים של ממשק. בניית ממשק משתמש גרפי עבור שולחן העזרה שלך באמצעות PowerShell הוא דוגמה נהדרת לכך. זהו אחד מאותם רגעים שבהם יותר ראוי לבנות כלים גרפיים.

Not a reader? Watch this related video.

כאשר אתה אפשר עמוד אימות של המשתמש הסופי בעת איפוס סיסמאות בשולחן העזרה. צמצום הרגישות להנדסה חברתית שלך עם Specops Secure Service Desk. צרו איתנו קשר להדגמה!

פוורשל יכול להשתמש בפונקציונליות ותכונות של .NET ולחשוף אותן. כתוצאה מכך, אפשר לכתוב ממשקי משתמש גרפיים עבור התסריטים שאתה יוצר. בניית ממשקי משתמש ב-PowerShell עשויה להראות מורכבת, במיוחד אם אתה מתחיל.

אך אם יש לך ניסיון בסיסי בתסריטות PowerShell, אין סיבה שלא תלמד ותשתדל להתאים את המימוש של יצירת ממשק גרפי לתסריטים שלך.

בפוסט הזה, תלמד איך ל יצור PowerShell ממשק באמצעות מסגרת התצוגה של Windows (WPF).

דרישות מוקדמות

לפני שתתקדם, ודא שאתה עומד בדרישות הבאות:

  1. ויזואל סטודיו 2017 או מאוחר יותר – תשתמש בזה כדי ליצור את ממשק המשתמש הגרפי באמצעות WPF. תוכל להוריד גרסה חינמית/קהילתית.
  2. 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
  3. A Windows 10 computer with Windows PowerShell 5.1.

בניית התסריט

בפוסט זה, תיצור תסריט פשוט בשם Main.ps1. בתוך התסריט, תכתוב קוד שיביא מידע על דיסק ממערכת מקומית או מרחוק על ידי שאילתת המחלקה WMI Win32_LogicalDisk.

תצטרך תסריט לעטוף גרפיקה מעליו בראשונה. בחרתי להשתמש בתסריט שמאפשר לך לספק שם מחשב ולשאול את מידע הדיסקים. זה לא הכרחי לבניית גרפיקה, אף פעם. השתמש בטכניקות שתלמד בפוסט זה כדי להתאים את הגרפיקה שלך לתסריטים שלך.

כדוגמת תסריט, אני איצור פונקציה שבוצעות בהם פעולות אלו:

  1. לקבל קלט לשם המחשב לשאילתה
  2. לשאול את המחשב ולאחסן את מידע הדיסקים הקבועים במשתנה
  3. להחזיר את התוצאות

כתיבת הפונקציה

למטה היא הפונקציה שתשתמש בה לפרויקט זה, בשם Get-FixedDisk. מטרת הפרויקט היא לקבל מידע על הדיסקים הקבועים או הדיסקים הקבועים במכונה היעד.

בעוד שחלק זה של הקוד יכול לשמש כמו שהוא, יהיה מועיל ליצור גרפיקה אם תרצה פשוט לבצע שאילתה מהירה מבלי להיות צריך להשתמש בפונקציה ולהקליד את הפקודות ידנית כל פעם.

Function Get-FixedDisk {
    [CmdletBinding()]
    # בלוק פרמטרים זה מציין את תחילת ההכרזה על פרמטרים
    param (
        <# 
            פרמטר זה מקבל את שם המחשב היעד.
            יש גם הגדרה שהוא חובה כך שהפונקציה לא תרוץ בלעדיו של הצוויה.
        #>
        [Parameter(Mandatory)]
        [string]$Computer
    )
    <#
        פקודת שאילתת WMI שמשיגה את רשימת כל הדיסקים הלוגיים ושומרת את התוצאות במשתנה בשם $DiskInfo
    #>
    $DiskInfo = Get-WmiObject Win32_LogicalDisk -ComputerName $Computer -Filter 'DriveType=3'
   $DiskInfo
}

ניתן לראות שהוספתי בקוד param() . זה על מנת להורות לפונקציה לקבל קלטים בהתאם לסוג הנתונים המצויין.

בדוגמה, הוספתי פרמטר Computer המקבל ערך מחרוזת. גם, על ידי הוספת התכונה Mandatory לפרמטר, מוודאים שהפונקציה לא תרוץ אם הפרמטר Computer לא יוגדר בזמן הרצה.

לבסוף, שורה 18 מציגה את פקודת השאילתת WMI המשיגה את רשימת כל הדיסקים הלוגיים ושומרת את התוצאות במשתנה בשם $DiskInfo. נוסף סינון כדי לקבל רק את הדיסקים עם DriveType=3. הסינון מבטיח שתוצג רק מידע על דיסקים קבועים מקומיים.

ייבוא הקוד (Dot Sourcing)

בנקובי כרגע יש לך סקריפט פעיל ואתה מוכן לבדוק אותו. אך לפני שתוכל לבדוק את הסקריפט, עליך לייבא את הקוד לסשן של PowerShell. דרך אחת לטעון קוד לסשן של PowerShell היא על ידי dot sourcing.

כדי לבצע dot source לסקריפט, יש להקליד נקודה (.) ורווח לפני נתיב הסקריפט. אם הסקריפט נמצא בתיקייה C:\PoshGUI-sample, ניתן לבצע dot source כמו בדוגמה הבאה.

PS C:\PoshGUI-sample> . .\Main.ps1

ניתן גם לציין את הנתיב המלא אם אתה לא בתיקייה הנוכחית. בקוד הדוגמה שלמטה, תראה את הנתיב המלא של הסקריפט.

PS C:>. C:\PoshGUI-sample\Main.ps1

עכשיו שיש לנו את הקוד מיובא לזיכרון, נוכל להמשיך ולבדוק את הפונקציה שיצרנו. בדוגמה למטה, מוצג שהפונקציה Get-FixedDisk נעשית שימוש בכדי לשאול את המחשב poshLabExc.

PS51> Get-FixedDisk -Computer poshLabExc

DeviceID     : C:
DriveType    : 3
ProviderName :
FreeSpace    : 53037772800
Size         : 135838822400
VolumeName   : Windows

DeviceID     : D:
DriveType    : 3
ProviderName :
FreeSpace    : 14872641536
Size         : 17178750976
VolumeName   : Temporary Storage

DeviceID     : E:
DriveType    : 3
ProviderName :
FreeSpace    : 488202240
Size         : 524283904
VolumeName   : System Reserved

בניה של ממשק המשתמש של PowerShell

בנקובי, יש לך כבר את קובץ הסקריפט בשם Main.ps1, ובתוך הסקריפט יצרת את הפונקציה Get-FixedDisk. כמו כן, אתה יכול לבדוק ולוודא שהפונקציה עובדת.

עכשיו שאתה יודע שהסקריפט עובד, תוכל להתחיל לבנות את ממשק המשתמש הגרפי.

עיצוב טופס PowerShell 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

אז תוכל להתחיל לבנות!

כדי להתחיל ליצור את ממשק המשתמש, פתח את Visual Studio וצור פרויקט חדש.

פעם שה-Visual Studio פתוח, לחץ על File (1) –> New (2) –> Project (3).

Creating a new Visual Studio project

בחלון New Project, בחר Visual C# (1), בחר WPF App (.NET Framework) (2), שנה את השם ל- PoshGUI-sample (3) ולחץ על OK.

Choosing a Visual Studio project

ברגע שהפרוייקט נוצר, יוצג לך טופס ריק בשם MainWindow.xaml.

Visual Studio MainWindow.xaml

עכשיו עליך לסדר את הטופס כך שיתאים לדרישות שלנו. למטה יש את הפקדים והפורמט שתצטרך להוסיף.

  • חלון
    • כותרת: מידע דיסק
    • גובה: 326
    • רוחב: 403
  • פקדים (4)
    • תווית
      • תוכן: "שם המחשב:"
      • שוליים: 10, 10, 0, 0
    • תיבת טקסט
      • שם: txtComputer
      • טקסט: ""
      • גובה: 23
      • רוחב: 174
    • כפתור
      • שם: btnQuery
      • תוכן: שאילתה
      • שוליים: 0, 13, 12, 0
    • תיבת טקסט
      • שם: txtResults
      • טקסט: ""
      • IsReadOnly: True
      • שוליים: 10, 60, 0, 0
      • גובה: 225
      • רוחב: 373

המראה הסופית של הטופס צריכה להיות דומה למה שמוצג בתמונה למטה. תוכל לארגן מחדש את מבנה החלון שלך בצורה שונה. תהיי יצירתית!

PowerShell GUI Template

שילוב הסקריפט וממשק המשתמש ב- PowerShell

כשתהיה מרוצה מעיצוב שלך, את כעת יכולה להתחיל לשלב אותו עם הסקריפט.

PowerShell אינו יכול להציג טפסים בצורה טבעית. כדי להציג את הטופס, אנו צריכים להוסיף שורת קוד בראש הסקריפט שלנו כדי לתמוך בהצגת טפסי WPF.

Add-Type -AssemblyName PresentationFramework

לאחר מכן, הוסף קוד לביצוע הפעולות הבאות:

  1. ייבא וקרא את קוד ה- XAML של הטופס.
  2. צור באופן דינמי משתנים המשויכים לכל פקד שקולט.
  3. הצג את הטופס

למטה יש הקוד המעודכן בסקריפט שלך.

הערה: וודא שאתה משנה את השורה $xamlFile ומצביע על הנתיב המלא של קובץ ה-XAML שלך.

Add-Type -AssemblyName PresentationFramework

Function Get-FixedDisk {
    [CmdletBinding()]
    # בלוק זה של param() מציין את תחילת הצהרת הפרמטרים
    param (
        <# 
            פרמטר זה מקבל את שם המחשב המטרה.
            הוא גם מוגדר כחובה כך שהפונקציה לא תתבצע בלעדיו של ערך ספציפי.
        #>
        [Parameter(Mandatory)]
        [string]$Computer
    )
    <#
        פקודת שאילתת WMI המקבלת את רשימת כל דיסקים לוגיים ושומרת את התוצאות במשתנה בשם $DiskInfo
    #>
    $DiskInfo = Get-WmiObject Win32_LogicalDisk -ComputerName $Computer -Filter 'DriveType=3'
    $DiskInfo
}

# איפה נמצא קובץ ה-XAML?
$xamlFile = "C:\PoshGUI-sample\MainWindow.xaml"

# יצירת חלון
$inputXML = Get-Content $xamlFile -Raw
$inputXML = $inputXML -replace 'mc:Ignorable="d"', '' -replace "x:N", 'N' -replace '^<Win.*', '<Window'
[XML]$XAML = $inputXML

# קריאה של קובץ ה-XAML
$reader = (New-Object System.Xml.XmlNodeReader $xaml)
try {
    $window = [Windows.Markup.XamlReader]::Load( $reader )
} catch {
    Write-Warning $_.Exception
    throw
}

# יצירת משתנים בהתבסס על שמות שלטי הטופס.
# המשתנה ייקרא 'var_<שם שלט>'

$xaml.SelectNodes("//*[@Name]") | ForEach-Object {
    #"מנסה פריט $($_.Name)"
    try {
        Set-Variable -Name "var_$($_.Name)" -Value $window.FindName($_.Name) -ErrorAction Stop
    } catch {
        throw
    }
}
Get-Variable var_*

$Null = $window.ShowDialog()

הערה: $Null = $window.ShowDialog() חייבת תמיד להיות השורה האחרונה בקוד בתוך הסקריפט שלך.

כאשר אתה מפעיל את הקוד הזה על ידי ביצוע הסקריפט Main.ps1, אתה אמור לראות את תוצאות הדוגמה למטה.

PowerShell GUI variable and field mappings

כפי שאתה יכול לראות, השלושה שלטים הקרויים קיבלו את המשתנים שלהם. שמות המשתנים הללו ייעזרו מאוחר יותר בסקריפט כשנוסיף קוד לוגיקת שלטים.

  • var_btnQuery
  • var_btnComputer
  • var_txtResults

שימו לב שבנקודה זו התסריט יכול רק להציג את הטופס, אך השליטים אינם שימושיים מאחר ולא הוספתם קוד עדיין.

הוספת קוד אירוע לחיצת הכפתור

עכשיו ששיניתם בהצלחה את התסריט כך שהוא מייבא ומציג את ממשק המשתמש הגרפי, התחילו להוסיף את הקוד לשליטים כדי לאחזר ולהציג את נתוני מידע הדיסק.

בפרויקט זה, רק לכפתור btnQuery יועבר פעולה. השליטים האחרים ישמשו רק כשליטי קלט ופלט/הצגה. זה אומר שאנו צריכים רק להוסיף קוד click ל־btnQuery.

כדי להוסיף את הפעולת click ל־btnQuery, הקצו את הקוד שלמטה לשם המשתנה המתאים של $var_btnQuery. העתיקו את הקוד שלמטה והכניסו אותו בין ההפניות לקוד Get-Variable var_* ו־$Null = $window.ShowDialog() בתסריט.

$var_btnQuery.Add_Click( {
   #נקה את תיבת התוצאות
   $var_txtResults.Text = ""
       if ($result = Get-FixedDisk -Computer $var_txtComputer.Text) {
           foreach ($item in $result) {
               $var_txtResults.Text = $var_txtResults.Text + "DeviceID: $($item.DeviceID)`n"
               $var_txtResults.Text = $var_txtResults.Text + "VolumeName: $($item.VolumeName)`n"
               $var_txtResults.Text = $var_txtResults.Text + "FreeSpace: $($item.FreeSpace)`n"
               $var_txtResults.Text = $var_txtResults.Text + "Size: $($item.Size)`n`n"
           }
       }       
   })

$var_txtComputer.Text = $env:COMPUTERNAME

בדיקת התסריט המוכן של PowerShell GUI

עם כל החלקים מכוסים, להלן הקוד המושלם של התסריט שלנו שמשלב את הפונקציה וממשק המשתמש של PowerShell שעיצבנו.

Add-Type -AssemblyName PresentationFramework

Function Get-FixedDisk {
    [CmdletBinding()]
    # בלוק זה param() מציין את תחילת הצהרת הפרמטרים
    param (
        <# 
            פרמטר זה מקבל את שם המחשב היעד.
            הוא מוגדר גם כחובה כך שהפונקציה לא תתבצע בלעדיו של ערך.
        #>
        [Parameter(Mandatory)]
        [string]$Computer
    )
    <#
        פקודת שאילתת WMI שמביאה את רשימת כל דיסקים לוגיים ושומרת את התוצאות במשתנה בשם $DiskInfo
    #>
    $DiskInfo = Get-WmiObject Win32_LogicalDisk -ComputerName $Computer -Filter 'DriveType=3'
   $DiskInfo
}

#איפה נמצא קובץ ה-XAML?
$xamlFile = "C:\Users\june\source\repos\PoshGUI-sample\PoshGUI-sample\MainWindow.xaml"

#יצירת חלון
$inputXML = Get-Content $xamlFile -Raw
$inputXML = $inputXML -replace 'mc:Ignorable="d"', '' -replace "x:N", 'N' -replace '^<Win.*', '<Window'
[xml]$XAML = $inputXML
#קריאת XAML

$reader = (New-Object System.Xml.XmlNodeReader $xaml)
try {
    $window = [Windows.Markup.XamlReader]::Load( $reader )
}
catch {
    Write-Warning $_.Exception
    throw
}

#יצירת משתנים על פי שמות של בקרי טופס.
#המשתנה יקרא 'var_<שם בקר>'

$xaml.SelectNodes("//*[@Name]") | ForEach-Object {
    #"ניסיון פריט $($_.Name)";
    try {
        Set-Variable -Name "var_$($_.Name)" -Value $window.FindName($_.Name) -ErrorAction Stop
    } catch {
        throw
   }
}

Get-Variable var_*

$var_btnQuery.Add_Click( {
   #ניקוי תיבת התוצאות
   $var_txtResults.Text = ""
       if ($result = Get-FixedDisk -Computer $var_txtComputer.Text) {
           foreach ($item in $result) {
               $var_txtResults.Text = $var_txtResults.Text + "DeviceID: $($item.DeviceID)`n"
               $var_txtResults.Text = $var_txtResults.Text + "VolumeName: $($item.VolumeName)`n"
               $var_txtResults.Text = $var_txtResults.Text + "FreeSpace: $($item.FreeSpace)`n"
               $var_txtResults.Text = $var_txtResults.Text + "Size: $($item.Size)`n`n"
           }
       }       
   })

$var_txtComputer.Text = $env:COMPUTERNAME
$Null = $window.ShowDialog()

כפי שניתן לראות למטה, לאחר קריאת התסריט ב-PowerShell, חלונות GUI של PowerShell הופיעו. לאחר מכן תוכל להזין שם מחשב תקין כדי לבדוק את הפונקציונליות.

PowerShell GUI Example Result

אמת מקורות באופן מאובטח עם שיטות אימות שמסירות את ההזדמנות להתחזות משתמש. חסום האקרים של מוקד העזרה עם Specops Secure Service Desk. נסה זאת בחינם!

סיכום

במאמר זה, למדת כיצד ליצור פונקציה פשוטה המקבלת קלט ומחזירה תוצאות. למדת גם כיצד ליצור ממשק משתמש פשוט ב- WPF PowerShell וכיצד לייבא אותו כפונקציה חזית לתסריט PowerShell שיצרת.

זהו סקריפט וממשק משתמש בסיסיים בלבד. ניתן לבצע שדרוגים רבים, כמו:

  • עיצוב גודל ומקום פנוי להצגת ערכים ב-GB.
  • שינוי שם התכונה שמוצגת.
  • שימוש ב-GridView במקום ב-TextBox להצגת התוצאות.
  • הוספת כפתור ייבוא ל־עבור על רשימת שרתים מקובץ CSV.

זה תלוי בך לשנות ולהוסיף פונקציות בהתאם לדרישות שלך.

קריאה נוספת

Source:
https://adamtheautomator.com/powershell-gui/