如何在powershell中关闭Windows窗体?

问题描述 投票:0回答:1

我正在编写一个脚本,以对本例中的计算器中的某个程序进行访问控制

当您启动程序(脚本)时,脚本会生成一个包含用户名和时间戳的文本文件。如果第二个人尝试访问,脚本会检查该文本文件是否存在,并给出用户名和时间戳,并希望稍后再尝试。如果该文件不存在,您可以访问该程序并且将生成该文件。当您关闭程序时,该文件将被删除。

我正在使用一些 Windows 窗体来包含忽略函数并退出脚本。

问题是,在您点击两个窗体上的忽略按钮后,Windows 窗体不会关闭。

我不知道如何解决它。

代码:

##### further functions #####

Function Warnung {
[reflection.assembly]::LoadWithPartialName( "System.Windows.Forms")

$Form1.text = "Warning!"
$Form1.Width = 300
$Form1.Height = 200

$Text = New-Object Windows.Forms.Label
$Text.Location = New-Object Drawing.Point 75,30
$Text.Size = New-Object Drawing.Point 200,30
$Text.text = "Am $timestamp hat sich" 

$Text2 = New-Object Windows.Forms.Label
$Text2.Location = New-Object Drawing.Point 75,60
$Text2.Size = New-Object Drawing.Point 200,30
$Text2.text = "$user"

$Text3 = New-Object Windows.Forms.Label
$Text3.Location = New-Object Drawing.Point 75,90
$Text3.Size = New-Object Drawing.Point 200,30
$Text3.text = "im calculator angemeldet!"

$Close = New-Object Windows.Forms.Button
$Close.text = "Close"
$Close.Location = New-Object Drawing.Point 20,120
$Close.add_click({$Form1.Close()})

$Taskmgr = New-Object Windows.Forms.Button
$Taskmgr.text = "Taskmgr"
$Taskmgr.Location = New-Object Drawing.Point 105,120
$Taskmgr.add_click({Taskmgr})

$Ignore = New-Object Windows.Forms.Button
$Ignore.text = "Ignore"
$Ignore.Location = New-Object Drawing.Point 190,120
$Ignore.add_click({Warning2})

$Form1.controls.add($Close)
$Form1.controls.add($Taskmgr)
$Form1.controls.add($Ignore)
$Form1.controls.add($Text)
$Form1.controls.add($Text2)
$Form1.controls.add($Text3)
$Form1.ShowDialog()
}

Function Taskmgr{
$Form1.Close() 
Start-process taskmgr.exe
}

Function Ign2{
$Form2.Close() 
$Form1.Close() 
Remove-Item C:\users\heisem\desktop\test.txt
$date = Get-Date
$file = "C:\users\heisem\desktop\test.txt"
$env:username | set-content $file
$date | add-content $file
}

Function Warning2 {

$Form2.text = "Warnung!"
$Form2.Width = 300
$Form2.Height = 200

$Text4 = New-Object Windows.Forms.Label
$Text4.Location = New-Object Drawing.Point 40,30
$Text4.Size = New-Object Drawing.Point 200,70
$Text4.text = "Sind Sie sich sicher, dass Sie $user übergehen möchten?" 
               "Haben Sie $user angesprochen
                ob diese(r) den Passwortsafe verlassen kann/hat?" 

$Close2 = New-Object Windows.Forms.Button
$Close2.text = "Close"
$Close2.Location = New-Object Drawing.Point 20,120
$Close2.add_click({$Form2.Close()})

$Ignore2 = New-Object Windows.Forms.Button
$Ignore2.text = "Ignore"
$Ignore2.Location = New-Object Drawing.Point 190,120
$Ignore2.add_click({Ign2})

$Form2.controls.add($Close2)
$Form2.controls.add($Ignore2)
$Form2.controls.add($Text4)
$Form2.ShowDialog()
}            

##### Main function #####

[reflection.assembly]::LoadWithPartialName("System.Windows.Forms")
$Form1 = New-Object Windows.Forms.Form
$Form2 = New-Object Windows.Forms.Form    

if (Test-Path C:\users\heisem\desktop\test.txt) {

$user = Get-content "C:\users\heisem\desktop\test.txt" -totalcount 1 
$timestamp = Get-Content "C:\users\heisem\desktop\test.txt" | Select-Object -Skip 1
Warnung 
Start-Process calc.exe -Wait                   
Remove-Item C:\users\heisem\desktop\test.txt 

} else {

$datum = Get-Date
$datei = "C:\users\heisem\desktop\test.txt"
$env:username | set-content $datei
$datum | add-content $datei
Start-Process calc.exe -Wait
Remove-Item C:\users\heisem\desktop\test.txt    
}
windows forms powershell
1个回答
0
投票

这与您在调用

-Wait
时使用的
calc.exe
参数有关。您在调用
taskmgr.exe
的函数中不会遇到问题,因为您不使用
-Wait

我还会将

$Form1
$Form2
定义移出本地函数作用域,以便每个定义都可以在全局范围内访问它们。

相当疯狂地猜测,我认为

-Wait
参数不允许前面的代码完成执行,直到函数退出,即框架正在决定在您调用的进程存在时某些引用仍然需要存在。

##### further functions #####

Function Warnung {
    [reflection.assembly]::LoadWithPartialName( "System.Windows.Forms")

    $Form1.text = "Warning!"
    $Form1.Width = 300
    $Form1.Height = 200

    $Text = New-Object Windows.Forms.Label
    $Text.Location = New-Object Drawing.Point 75,30
    $Text.Size = New-Object Drawing.Point 200,30
    $Text.text = "Am $timestamp hat sich" 

    $Text2 = New-Object Windows.Forms.Label
    $Text2.Location = New-Object Drawing.Point 75,60
    $Text2.Size = New-Object Drawing.Point 200,30
    $Text2.text = "$user"

    $Text3 = New-Object Windows.Forms.Label
    $Text3.Location = New-Object Drawing.Point 75,90
    $Text3.Size = New-Object Drawing.Point 200,30
    $Text3.text = "im calculator angemeldet!"

    $Close = New-Object Windows.Forms.Button
    $Close.text = "Close"
    $Close.Location = New-Object Drawing.Point 20,120
    $Close.add_click({$Form1.Close()})

    $Taskmgr = New-Object Windows.Forms.Button
    $Taskmgr.text = "Taskmgr"
    $Taskmgr.Location = New-Object Drawing.Point 105,120
    $Taskmgr.add_click({Taskmgr})

    $Ignore = New-Object Windows.Forms.Button
    $Ignore.text = "Ignore"
    $Ignore.Location = New-Object Drawing.Point 190,120
    $Ignore.add_click({Warning2})

    $Form1.controls.add($Close)
    $Form1.controls.add($Taskmgr)
    $Form1.controls.add($Ignore)
    $Form1.controls.add($Text)
    $Form1.controls.add($Text2)
    $Form1.controls.add($Text3)
    $Form1.ShowDialog()
}

Function Taskmgr{
    $Form1.Close() ### IT WORKS HERE
    Start-process taskmgr.exe
}

Function Ign2{
    $Form2.Close() ### HERE IS THE PROBLEM
    $Form1.Close() ### THE FORMS DO NOT CLOSE
    Remove-Item C:\users\heisem\desktop\test.txt
    $date = Get-Date
    $file = "C:\users\heisem\desktop\test.txt"
    $env:username | set-content $file
    $date | add-content $file
    Start-Process calc.exe
    Remove-Item C:\users\heisem\desktop\test.txt
}

Function Warning2 {

    $Form2.text = "Warnung!"
    $Form2.Width = 300
    $Form2.Height = 200

    $Text4 = New-Object Windows.Forms.Label
    $Text4.Location = New-Object Drawing.Point 40,30
    $Text4.Size = New-Object Drawing.Point 200,70
    $Text4.text = "Sind Sie sich sicher, dass Sie $user übergehen möchten?" 
                   "Haben Sie $user angesprochen
                    ob diese(r) den Passwortsafe verlassen kann/hat?" 

    $Close2 = New-Object Windows.Forms.Button
    $Close2.text = "Close"
    $Close2.Location = New-Object Drawing.Point 20,120
    $Close2.add_click({$Form2.Close()})

    $Ignore2 = New-Object Windows.Forms.Button
    $Ignore2.text = "Ignore"
    $Ignore2.Location = New-Object Drawing.Point 190,120
    $Ignore2.add_click({Ign2})

    $Form2.controls.add($Close2)
    $Form2.controls.add($Ignore2)
    $Form2.controls.add($Text4)
    $Form2.ShowDialog()
}            

##### Main function #####

[reflection.assembly]::LoadWithPartialName("System.Windows.Forms")
$Form1 = New-Object Windows.Forms.Form
$Form2 = New-Object Windows.Forms.Form    

if (Test-Path C:\users\heisem\desktop\test.txt) {

    $user = Get-content "C:\users\heisem\desktop\test.txt" -totalcount 1 
    $timestamp = Get-Content "C:\users\heisem\desktop\test.txt" | Select-Object -Skip 1
    Warnung 

} else {

    $datum = Get-Date
    $datei = "C:\users\heisem\desktop\test.txt"
    $env:username | set-content $datei
    $datum | add-content $datei
    Start-Process calc.exe -Wait
    Remove-Item C:\users\heisem\desktop\test.txt    
}
© www.soinside.com 2019 - 2024. All rights reserved.