Powershell Forms刷新GUI

时间:2017-03-11 22:05:29

标签: powershell

该脚本是一个简单的管理工具,用于指示三个Windows服务的状态并切换它们。

一切正常但我没有完成它来实现GUI的刷新。

我想在标签中显示相关状态并隐藏不可点击的按钮。到目前为止我用计时器玩,但GUI仍然没有刷新..

#variables
$ums = get-service "UMS Server"
$mySQL = get-service "mySQL56"
$maria = get-service "MariaDB_10.1.21"

function OnApplicationLoad {
return $true 
}
function OnApplicationExit {
$script:ExitCode = 0 
}



function generateForm {
Add-Type -AssemblyName System.Windows.Forms


$UMSDatabaseadministration = New-Object system.Windows.Forms.Form
$UMSDatabaseadministration.Text = "UMS Database administration"
$UMSDatabaseadministration.TopMost = $true
$UMSDatabaseadministration.Width = 614
$UMSDatabaseadministration.Height = 316
$UMSDatabaseadministration.StartPosition = "CenterScreen"

$timer = New-Object System.Windows.Forms.Timer #$UMSDatabaseadministration
$timer.Interval = 1000  # once per second
$timer.Add_Tick({ $UMSDatabaseadministration.Refresh() })


#button 1 start UMS
$button11 = New-Object system.windows.Forms.Button
$button11.Text = "start"
$button11.Width = 60
$button11.Height = 30

if ($ums.Status -eq "Running"){
$button11.visible = $false
}
$button11.Add_Click({
                        $ums.start()


                        })
$button11.location = new-object system.drawing.point(303,38)
$button11.Font = "Microsoft Sans Serif,10"
$UMSDatabaseadministration.controls.Add($button11)

#button 2 stop UMS
$button15 = New-Object system.windows.Forms.Button
$button15.Text = "stop"
$button15.Width = 60
$button15.Height = 30

if ($ums.Status -eq "Stopped"){
$button15.visible = $false
}
$button15.Add_Click({$ums.stop()})
$button15.location = new-object system.drawing.point(409,39)
$button15.Font = "Microsoft Sans Serif,10"
$UMSDatabaseadministration.controls.Add($button15)

#button 3 start mySQL
$button12 = New-Object system.windows.Forms.Button
$button12.Text = "start"
$button12.Width = 60
$button12.Height = 30

if ($maria.Status -eq "Running" -Or $mySQL.Status -eq "Running"){
$button12.visible = $false
}
$button12.Add_Click({$mySQL.start()})
$button12.location = new-object system.drawing.point(303,98)
$button12.Font = "Microsoft Sans Serif,10"
$UMSDatabaseadministration.controls.Add($button12)

#button 4 stop mySQL
$button14 = New-Object system.windows.Forms.Button
$button14.Text = "stop"
$button14.Width = 60
$button14.Height = 30

if ($mySQL.Status -eq "Stopped"){
$button14.visible = $false
}
$button14.Add_Click({$mySQL.stop()})
$button14.location = new-object system.drawing.point(410,99)
$button14.Font = "Microsoft Sans Serif,10"
$UMSDatabaseadministration.controls.Add($button14)

#button 5 start mariaDB
$button13 = New-Object system.windows.Forms.Button
$button13.Text = "start"
$button13.Width = 60
$button13.Height = 30

if ($mySQL.Status -eq "Running" -Or $maria.Status -eq "Running"){
$button13.visible = $false
}
$button13.Add_Click({$maria.start()})
$button13.location = new-object system.drawing.point(302,147)
$button13.Font = "Microsoft Sans Serif,10"
$UMSDatabaseadministration.controls.Add($button13)



#button 6 stop mariaDB
$button16 = New-Object system.windows.Forms.Button
$button16.Text = "stop"
$button16.Width = 60
$button16.Height = 30

if ($maria.Status -eq "Stopped"){
$button16.visible = $false
}
$button16.Add_Click({$maria.stop()})
$button16.location = new-object system.drawing.point(410,148)
$button16.Font = "Microsoft Sans Serif,10"
$UMSDatabaseadministration.controls.Add($button16)


$button17 = New-Object system.windows.Forms.Button
$button17.Text = "shut down UMS Server and toggle DB`'s"

$button17.Add_Click({ 

#variables
$ums = get-service "UMS Server"
$mySQL = get-service "mySQL56"
$maria = get-service "MariaDB_10.1.21"

if ($ums.Status -eq "Running") {$ums.stop()}

if ($mySQL.Status -eq "Running") {$mySQL.stop(); $maria.start()}

if ($maria.Status -eq "Running") {$maria.stop(); $mySQL.start()}

})


$button17.Width = 166
$button17.Height = 42
$button17.location = new-object system.drawing.point(303,209)
$button17.Font = "Microsoft Sans Serif,10"
$UMSDatabaseadministration.controls.Add($button17)



$label18 = New-Object system.windows.Forms.Label
$label18.Text = "UMS Server is:"
$label18.AutoSize = $true
$label18.Width = 25
$label18.Height = 10
$label18.location = new-object system.drawing.point(33,38)
$label18.Font = "Microsoft Sans Serif,10"
$UMSDatabaseadministration.controls.Add($label18)


$label19 = New-Object system.windows.Forms.Label
$label19.Text = "mySQL is:"
$label19.AutoSize = $true
$label19.Width = 25
$label19.Height = 10
$label19.location = new-object system.drawing.point(33,95)
$label19.Font = "Microsoft Sans Serif,10"
$UMSDatabaseadministration.controls.Add($label19)


$label20 = New-Object system.windows.Forms.Label
$label20.Text = "mariaDB is:"
$label20.AutoSize = $true
$label20.Width = 25
$label20.Height = 10
$label20.location = new-object system.drawing.point(34,146)
$label20.Font = "Microsoft Sans Serif,10"
$UMSDatabaseadministration.controls.Add($label20)

#status UMS red
$label24 = New-Object system.windows.Forms.Label
$label24.Text = $ums.status
$label24.AutoSize = $true
$label24.ForeColor = "#fe0004"
$label24.Width = 25
$label24.Height = 10

if ($ums.status -eq "Running"){
$label24.visible = $false
}
$label24.location = new-object system.drawing.point(152,37)
$label24.Font = "Microsoft Sans Serif,10"
$UMSDatabaseadministration.controls.Add($label24)

#status UMS green
$label25 = New-Object system.windows.Forms.Label
$label25.Text = $ums.status
$label25.AutoSize = $true
$label25.ForeColor = "#149600"
$label25.Width = 25
$label25.Height = 10

if ($ums.status -eq "Stopped"){
$label25.visible = $false
}
$label25.location = new-object system.drawing.point(153,40)
$label25.Font = "Microsoft Sans Serif,10"
$UMSDatabaseadministration.controls.Add($label25)

#status mySQL red
$label26 = New-Object system.windows.Forms.Label
$label26.Text = $mySQL.status
$label26.AutoSize = $true
$label26.ForeColor = "#ff0004"
$label26.Width = 25
$label26.Height = 10

if ($mySQL.status -eq "Running"){
$label26.visible = $false
}
$label26.location = new-object system.drawing.point(152,94)
$label26.Font = "Microsoft Sans Serif,10"
$UMSDatabaseadministration.controls.Add($label26)

#status mySQL green
$label27 = New-Object system.windows.Forms.Label
$label27.Text = $mySQL.status
$label27.AutoSize = $true
$label27.ForeColor = "#149600"
$label27.Width = 25
$label27.Height = 10

if ($mySQL.status -eq "Stopped"){
$label27.visible = $false
}
$label27.location = new-object system.drawing.point(152,96)
$label27.Font = "Microsoft Sans Serif,10"
$UMSDatabaseadministration.controls.Add($label27)

#status mariaDB red
$label28 = New-Object system.windows.Forms.Label
$label28.Text = $maria.status
$label28.AutoSize = $true
$label28.ForeColor = "#ff0004"
$label28.Width = 25
$label28.Height = 10

if ($maria.status -eq "Running"){
$label28.visible = $false
}
$label28.location = new-object system.drawing.point(151,145)
$label28.Font = "Microsoft Sans Serif,10"
$UMSDatabaseadministration.controls.Add($label28)

#status mariaDB green
$label29 = New-Object system.windows.Forms.Label
$label29.Text = $maria.status
$label29.AutoSize = $true
$label29.ForeColor = "#149600"
$label29.Width = 25
$label29.Height = 10

if ($maria.status -eq "Stopped"){
$label29.visible = $false
}
$label29.location = new-object system.drawing.point(151,145)
$label29.Font = "Microsoft Sans Serif,10"
$UMSDatabaseadministration.controls.Add($label29)


[void]
$UMSDatabaseadministration.ShowDialog()
$UMSDatabaseadministration.Dispose()


}



if(OnApplicationLoad -eq $true)
{
GenerateForm | Out-Null
$timer.Start()
OnApplicationExit
}

1 个答案:

答案 0 :(得分:2)

首先,我必须说你的代码需要大量的TLC。您不应该标记按钮或标签1-20。使代码看起来很混乱,在15天后,您将不知道代码说的是什么。在第2-4和128-130行,您将变量定义两次。

我现在所做的就是创建这个服务GUI,它不仅可以帮助您,还可以帮助您完成相同类型的任务。您可以将所需的服务添加到Param函数中。

首先,我们看看您是否是管理员,因为不是每个人都是。

Add-Type -AssemblyName System.Windows.Forms
function Test-Admin {
  $currentUser = New-Object Security.Principal.WindowsPrincipal $([Security.Principal.WindowsIdentity]::GetCurrent())
  $currentUser.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)
}
if ((Test-Admin) -eq $false)  {
    if ($elevated) 
    {
        # tried to elevate, did not work, aborting
    } 
    else {
        Start-Process powershell.exe -Verb RunAs -ArgumentList ('-noprofile -noexit -file "{0}" -elevated' -f ($myinvocation.MyCommand.Definition))
}

exit
}

我们创建了一个具有参数的中心位置。

请注意,您看到我使用$Global:您可以在此处阅读: https://msdn.microsoft.com/en-us/powershell/reference/3.0/microsoft.powershell.core/about/about_scopes

Function Param{
$Global:Option1 = get-service "Hamachi2Svc"
$Global:Option2 = get-service "NitroUpdateService"
$Global:Option3 = get-service "TeamViewer"

$Global:Option1Txt=$Global:Option1.Displayname
$Global:Option2Txt=$Global:Option2.Displayname
$Global:Option3Txt=$Global:Option3.Displayname
}

现在我们创建表单

Function ServiceAdminForm {
    $Form.Close()
    $Form.Dispose()
    Test-Admin
    MakeForm
}

现在我们定义按钮将使用的功能。

Function Option1 {
if ($Global:Option1.Status -eq "Running"){ Stop-Service $Global:Option1
}
else {Start-Service $Global:Option1}
}

Function Option2 {
if ($Global:Option2.Status -eq "Running"){ Stop-Service $Global:Option2
}
else {Start-Service $Global:Option2}
}

Function Option3 {
if ($Global:Option3.Status -eq "Running"){ Stop-Service $Global:Option3
}
else {Start-Service $Global:Option3}
}

Function Toggle {
if ($Global:Option1.Status -eq "Running") {$Global:Option1.stop()}
if ($Global:Option2.Status -eq "Running") {$Global:Option2.stop(); $Global:Option3.start()}
if ($Global:Option3.Status -eq "Running") {$Global:Option3.stop(); $Global:Option2.start()}
}

现在我们制作GUI的布局

调用参数和按钮功能。

Function MakeForm {
Param

    $script:Form = New-Object system.Windows.Forms.Form
    $Form.Text = "Service Administration"
    $Font = New-Object System.Drawing.Font("Times New Roman",12,[System.Drawing.FontStyle]::Bold)
    $Form.Font = $Font

    #Label for Option1
    $Global:Option1lbl = New-Object system.windows.Forms.Label
    $Global:Option1lbl.Text = $Global:Option1.Status
    $Global:Option1lbl.AutoSize = $true
    $Global:Option1lbl.Width = 25
    $Global:Option1lbl.Height = 10
    $Global:Option1lbl.location = new-object system.drawing.point(5,90)

    #Label for Option2
    $Global:Option2lbl = New-Object system.windows.Forms.Label
    $Global:Option2lbl.Text = $Global:Option2.Status
    $Global:Option2lbl.AutoSize = $true
    $Global:Option2lbl.Width = 25
    $Global:Option2lbl.Height = 10
    $Global:Option2lbl.location = new-object system.drawing.point(5,150)

    #Label for Option3
    $Global:Option3lbl = New-Object system.windows.Forms.Label
    $Global:Option3lbl.Text = $Global:Option3.Status
    $Global:Option3lbl.AutoSize = $true
    $Global:Option3lbl.Width = 25
    $Global:Option3lbl.Height = 10
    $Global:Option3lbl.location = new-object system.drawing.point(5,210)

    #Refresh/Reload
    $Reloadbtn = New-Object System.Windows.Forms.Button
    $Reloadbtn.Location = New-Object System.Drawing.Size(5,10)
    $Reloadbtn.AutoSize = $true
    $Reloadbtn.Text = "Reload"
    $Reloadbtn.Add_Click({ServiceAdminForm})

    #Toggle
    $Togglebtn = New-Object System.Windows.Forms.Button
    $Togglebtn.Location = New-Object System.Drawing.Size(80,10)
    $Togglebtn.AutoSize = $true
    $Togglebtn.Text = "Toggle"
    $Togglebtn.Add_Click({Toggle})

    #Button Option1
    $Global:Option1btn = New-Object System.Windows.Forms.Button
    $Global:Option1btn.Location = New-Object System.Drawing.Size(5,60)
    $Global:Option1btn.AutoSize = $true
    $Global:Option1btn.Text = "$Global:Option1Txt"
    $Global:Option1btn.Add_Click({Option1})

    #Button Option2
    $Global:Option2btn = New-Object System.Windows.Forms.Button
    $Global:Option2btn.Location = New-Object System.Drawing.Size(5,120)
    $Global:Option2btn.AutoSize = $true
    $Global:Option2btn.Text = "$Global:Option2Txt"
    $Global:Option2btn.Add_Click({Option2})

    #Button Option3
    $Global:Option3btn = New-Object System.Windows.Forms.Button
    $Global:Option3btn.Location = New-Object System.Drawing.Size(5,180)
    $Global:Option3btn.AutoSize = $true
    $Global:Option3btn.Text = "$Global:Option3Txt"
    $Global:Option3btn.Add_Click({Option3})

    #Form Controls
    $Form.Controls.Add($Global:Option1lbl)
    $Form.Controls.Add($Global:Option2lbl)
    $Form.Controls.Add($Global:Option3lbl)
    $Form.Controls.Add($Reloadbtn)
    $Form.Controls.Add($Togglebtn)
    $Form.Controls.Add($Global:Option1btn)
    $Form.Controls.Add($Global:Option2btn)
    $Form.Controls.Add($Global:Option3btn)
    $Form.ShowDialog()
}
MakeForm

也许某人有更好的刷新方法,但重新加载表单可以胜任。