2017-03-11 93 views
1

該腳本是一個簡單的管理工具,用於指示三個Windows服務的狀態並切換它們。Powershell窗體刷新GUI

一切工作正常,但我沒有做到實現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 
} 
+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 

也許有人有更好的方法來刷新,但重新加載表單做這項工作。

+0

謝謝您的詳細解答!與此同時,我清理了代碼,並提出了相同的想法,重新加載表單進行更新。它幾乎完成了這項工作。 – Philae

+0

@Philae,我很高興它爲你解決。 –