使用'退出'退出PowerShell脚本完全杀了我的程序

时间:2016-07-12 07:09:16

标签: powershell

我正在使用表单窗口来获取用户的一些输入,如果输入正确,我会在do-while循环中询问(如下所示:)

use Minishlink\WebPush\WebPush;

$endpoint = 'https://android.googleapis.com/gcm/send/dwh8heIRnRI:APA91bH1nKZESimKK7Oh9ttQeoRovaS4drmCTQfkpvgtyQQKZZ1htwo4e-tKjMw_cS0ozINkXxXV8-jnYmK2__ZCZbrZUVrJxb931CahVUuat08DRqg4Z7yFpserazwCzCNBEcjb2jfb'; // Chrome
$apiKeys = array(
    'GCM' => 'AIzacyDV2NtiuwLZGzDaC9bEeEeisS4BANjHw9s',
);

$webPush = new WebPush($apiKeys);

$webPush->sendNotification(
    "https://android.googleapis.com/gcm/send/foV7YNoaKbk:APA91bETu6fPcDHsliBIaI3R0ejFqgIUwfMGFatia1563nTXVZTACaZw3tFaHW-z0Tu7YvZLJebxiYEapyzygO_5WvONVHHNDz7G9KPyPLxl-Il3h6QdgMVJhsmWs0ENVEcFt9HJKX0U",
    "hey", // optional (defaults null)
    "$userPublicKey",
    "$userAuthToken"
    true // optional (defaults false)
);

这个请求的问题是我想询问该字段是否为空,但如果他按下取消而没有输入任何内容,则窗口将再次打开,如 while(true)循环...

我还在'退出' 这个程序中取了一个取消按钮,我放了(是的,你猜对了)这个按钮后面的退出,我的问题是PowerShell抛出我错误的程序已崩溃所以我正在寻找一种保存方式来停止我的程序崩溃!

while(($ParID -ne 6) -or ($Research_Groups -ne 3) -or ($Customer -lt 1) -or ($Projectname -lt 1))

这就是它引发的错误:

enter image description here

 $objForm.Add_KeyDown({if ($_.KeyCode -eq "Escape") #Escape (ESC) -> when the key 'Escape (ESC)' has been pressed then the window closes
        {$objForm.Close()}}) #windowclose -> closes the window

2 个答案:

答案 0 :(得分:2)

您是否尝试过break而不是退出?这将停止你的While循环。 或者,如果您需要完全退出程序,则应将活动表单$Form.Dispose()设置为残酷的exit

修改

在大多数情况下,您不应在do / while循环中创建和生成表单。在我看来,最好使用while而不是整个表单。这就是我的想象:

#OKButton -> creates a button with the value 'OK'
$OKButton = New-Object System.Windows.Forms.Button #initialization -> initializes the button
$OKButton.Location = New-Object System.Drawing.Size(75,180) #Location -> where the button is located in the window
$OKButton.Size = New-Object System.Drawing.Size(75,23) #Size -> defines the size of the button
$OKButton.Text = "OK" #value -> sets the value of the button to 'OK'

$OKButton_OnClick = {

    if (
        ($ParIDInbox.Text.Length -lt 6) -or
        ($ResearchGroupInbox.Text.Length -lt 3) -or
        [string]::IsNullOrWhiteSpace($CustomerInbox.Text) -or
        [string]::IsNullOrWhiteSpace($ProjectnameInbox.Text.Length)
    ) {
        [System.Windows.Forms.MessageBox]::Show("Please fill out all of the form fields", "ERROR", 
            [System.Windows.Forms.MessageBoxButtons]::OK, [System.Windows.Forms.MessageBoxIcon]::Error)
    }
    else {
        $ParID=$ParIDInbox.Text
        $Research_Groups=$ResearchGroupInbox.Text
        $Customer=$CustomerInbox.Text
        $Projectname=$ProjectnameInbox.Text

        Write-Host -f Yellow "$ParID | $Research_Groups | $Customer | $Projectname"

        $objForm.Dispose()
    }
}

$OKButton.Add_Click($OKButton_OnClick) #variables -> assigns the variables
$objForm.Controls.Add($OKButton) #adding -> adds the button to the window

上面的代码对我有用。刚检查过。

如果你需要多次调用你的表单,只需在while循环中调用它 - 不要重新创建它。每次调用表单时,它都会获取表单对象的默认值。最好检查表单字段,而不是您提供值的变量。

while ($condition) {
    $objForm.ShowDialog()
}

$objForm.Dispose()

<强> EDIT2:

更明智的想法:您不需要检查值长度 - 您可以为它们设置MaxLength参数

$ParIDInbox.MaxLength = 6
$ResearchGroupInbox.MaxLength = 3

答案 1 :(得分:0)

你也可以设置一个bool,例如$Exit并在您的条件下检查:

$checkInputs =  {
    (($using:ParID -ne 6) -or 
    ($using:Research_Groups -ne 3) -or 
    ($using:Customer -lt 1) -or 
    ($using:Projectname -lt 1)) -and
    !$using:Exit
}

while(Invoke-Command $checkInputs)
{
    # do your things here
}