使用 Windows 窗体在脚本终止后几分钟锁定 PowerShell ISE

2024-03-29

我这里有一个有趣的问题。我正在创建一个日历选择器,供我们创建帐户时使用。它工作正常并且仍在进行中,但我注意到当我在 powershell ISE 中运行脚本时,几分钟后它会锁定(我可以在此之前编辑并保存代码几分钟)。事件日志中没有任何内容。我收到一个对话框,显示 powershell 无响应。内存使用情况似乎也很正常。我不知道发生了什么事。

无论我如何运行 Powershell ISE(以管理员身份运行、以其他帐户运行和普通 ISE),都会发生这种情况,我运行的是 Windows 8.1。

同事建议可能是公寓型号的问题,所以我尝试了STA和MTA,但无论哪种方式都会出现问题。当从控制台主机运行相同的代码时,不会发生这种情况。

[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") 

$objForm = New-Object Windows.Forms.Form 

$objForm.Text = "Select a Date" 
$objForm.Size = New-Object Drawing.Size @(490,250)
$objForm.StartPosition = "CenterScreen"

$objForm.KeyPreview = $True

$objForm.Add_KeyDown({
    if ($_.KeyCode -eq "Enter") 
        {
            $script:dtmDate=$objCalendar.SelectionStart
            $objForm.Close()
        }
    })

$objForm.Add_KeyDown({
    if ($_.KeyCode -eq "Escape") 
        {
            $objForm.Close()
        }
    })

$objCalendar = New-Object System.Windows.Forms.MonthCalendar 
$objCalendar.Text = "Start"
$objCalendar.ShowTodayCircle = $False
$objCalendar.MaxSelectionCount = 1
$objForm.Controls.Add($objCalendar) 

$objForm.Topmost = $True

$objForm.Add_Shown({$objForm.Activate()})  
[void] $objForm.ShowDialog() 

if ($dtmDate)
    {
        Write-Host "Date selected: $dtmDate"
    }

$objForm.Dispose()

回应@The Unique Paul Smith

function Find-CalenderDateTest {
[CmdletBinding()]
param(
    [Parameter(
        Mandatory=$false
    )]
    [ValidateSet('long','short','powerpoint')]
    [ValidateNotNullOrEmpty()]
    [string]
    $DateFormat

)

Begin{
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") 

$objForm = New-Object Windows.Forms.Form 

$objForm.Text = "Select a Date" 
$objForm.Size = New-Object Drawing.Size @(243,250) 
$objForm.StartPosition = "CenterScreen"

$objForm.KeyPreview = $True

$dtmDate = $null

$objForm.Add_KeyDown( {
    if ($_.KeyCode -eq "Enter") 
        {
            $dtmDate=$objCalendar.SelectionStart
            $objForm.Close()
        }
    })


$objForm.Add_KeyDown({
    if ($_.KeyCode -eq "Escape") 
        {
            $objForm.Close()
        }
    })

#region   OK Button
$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Size(20,175)
$OKButton.Size = New-Object System.Drawing.Size(75,23)
$OKButton.Text = "OK"

# Got rid of the Click event for OK Button, and instead just assigned its DialogResult property to OK.
$OKButton.DialogResult = [System.Windows.Forms.DialogResult]::OK

$objForm.Controls.Add($OKButton)

# Setting the form's AcceptButton property causes it to automatically intercept the Enter keystroke and
# treat it as clicking the OK button (without having to write your own KeyDown events).
$objForm.AcceptButton = $OKButton
#endregion 

#region Cancel Button
$CancelButton = New-Object System.Windows.Forms.Button
$CancelButton.Location = New-Object System.Drawing.Size(80,175)
$CancelButton.Size = New-Object System.Drawing.Size(75,23)
$CancelButton.Text = "Cancel"

# Got rid of the Click event for Cancel Button, and instead just assigned its DialogResult property to Cancel.
$CancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel

$objForm.Controls.Add($CancelButton)

# Setting the form's CancelButton property causes it to automatically intercept the Escape keystroke and
# treat it as clicking the OK button (without having to write your own KeyDown events).
$objForm.CancelButton = $CancelButton
#endregion 

$objCalendar = New-Object System.Windows.Forms.MonthCalendar 
$objCalendar.ShowTodayCircle = $False
$objCalendar.MaxSelectionCount = 1
$objForm.Controls.Add($objCalendar) 

$objForm.Topmost = $True

$objForm.Add_Shown({$objForm.Activate()})  

$Results = $objForm.ShowDialog()
}

Process{}

End{
if ($Results -eq "OK")
    {
    $objCalendar.SelectionStart
    }

$objForm.Dispose()

}
}

错误是 MTA/STA

不要使用

$form.showDialog()

Use

[system.windows.forms.application]::run($form)

instead

每次都工作得很好

另一种方法是将其放在另一个线程中:

$code
{
  //form code here
  $form.showDialog()
}
$newThread = [Powershell]::Create()
$newThread.AddScript($code)
$handle = $newThread.BeginInvoke() 

提供调用脚本中的变量:

$newThread.Runspace.SessionStateProxy.SetVariable("variablenname",value)

之前BeginInvoke use variablenname没有$...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Windows 窗体在脚本终止后几分钟锁定 PowerShell ISE 的相关文章

随机推荐

  • 带有锚点 (#) 参数的 Django 重定向()

    我目前正在使用 Django 的 redirect 方法来构造要重定向到的 URL 我不想对 URL 进行硬编码 所以我一直这样做 return redirect main views home home slug slug 这让我想到了类
  • MATLAB 的“SIGMA 必须是对称且正定”错误有时没有意义

    我不确定这是一个编程问题还是统计问题 但我 99 确定应该存在一个数字问题 因此也许可以提出一个程序化的解决方案 我正在使用 MATLAB mvnpdf 函数来计算一些观测值的多元高斯 PDF 我经常收到 SIGMA 必须是对称且正定的 错
  • $_SERVER['QUERY_STRING'] 不按原样打印 unicode 值

    http localhost fw api fw api php rule unicode action create phrase 我访问上面的网址 在fw api php 当我回显 SERVER QUERY STRING 它没有给出 U
  • 使用 TensorFlow .pb 图作为 Keras 模型

    我使用内置 TensorFlow 工具来微调 InceptionV3 模型的最后一层 以便对自定义数据集上的项目进行分类本教程 https www tensorflow org tutorials image retraining 这会生成
  • 如何在不使用 API 的情况下向 Drupal 6.x 注册用户?

    我们必须有一个通过用 java 编写的 Web 服务可用的 注册 方法 因此从今往后我们无法访问 Drupal API 但我们需要能够成功注册用户 简单地将用户添加到用户表中是行不通的 因为新创建的用户永远无法成功登录 我再次喜欢 Drup
  • Apache 设置 000-default.conf 文件

    我确信这是一个简单的问题 我已经流浪了一台机器并设置了 LAMP IP 配置为 10 0 0 10 在我的 Windows 计算机中 我修改了主机文件并添加了一个名为 rsywx remote 的条目 从我的 Windows 机器到我的 v
  • R中的标准评估和非标准评估

    我对 dplyr 函数的参数感到困惑 并且不太清楚标准评估 SE 或非标准评估 NSE 我只想将变量传递给 dplyr arrange 但失败了 但是 传递给 dplyr select 是有效的 gt library dplyr gt li
  • width=device-width 在移动 IE 中不起作用

    我正在尝试制作一个在手机上运行良好的网站 到目前为止 我测试过的每部手机都运行良好 但装有 Windows Mobile IE 的手机除外 看来 Mobile IE 只是读取了并且没有将宽度设置为设备宽度 有人有这方面的经验或任何让网站在移
  • 使用 Django Rest Framework,如何上传文件并发送 JSON 有效负载?

    我正在尝试编写一个 Django Rest Framework API 处理程序 它可以接收文件以及 JSON 有效负载 我已将 MultiPartParser 设置为处理程序解析器 然而 我似乎无法两者兼得 如果我将有效负载与文件一起作为
  • Doxygen 注释的“使用命名空间”

    我的库的所有类都是在命名空间内定义的 当我为 Doxygen 创建主页时 我必须在注释中显式使用此命名空间以使 Doxygen 生成链接 我想对整个评论块使用类似 使用命名空间 的内容 一个例子 mainpage My Library Us
  • java.lang.IllegalStateException:getWritableDatabase 递归调用

    请帮我解决该错误 D AndroidRuntime 836 Shutting down VM W dalvikvm 836 threadid 1 thread exiting with uncaught exception group 0x
  • Vite - 静态文件不复制

    我有一个 Vue js 应用程序依赖于Vite https vitejs dev 在此应用程序中 我有两个静态文件需要复制到我的dist目录 favicon ico and manifest json My vite config js文件
  • Python MySQLdb 迭代表

    我有一个 SQL 数据库 我需要迭代表并在满足 WHERE 子句后执行操作 然后 一旦到达表的末尾 就返回到顶部并重新开始 目前我有 cursor database cursor cursor execute SELECT user id
  • 如何从特权容器访问docker主机文件系统

    不使用卷 v 我可以添加 privileged to docker run但我无法安装任意卷 因为我依赖另一个工具来创建 docker 容器 所以我的问题是如何完全访问 docker 主机文件系统 privileged true 够了吗 特
  • jQuery:如何检测元素是否未被单击?

    我想知道是否可以检测某个元素是否未被单击 这是我的代码 mpElement myFeature afterDo function This if else statement has to go inside when not clicke
  • 如何在 iOS 6.1 上正确设置 GKSession(蓝牙)

    我在让 GKSession 工作时遇到问题 下面是我的代码 当按下特定按钮时执行 GKSession session if connectButtonHasBeenPressed false NSLog connectToBluetooth
  • 仅当用户启用了 JavaScript 时才使用一些 CSS

    为了让我的网页正常降级 我有一些 CSS 只有在其相应的 JavaScript 能够运行时才应该加载它们 当且仅当浏览器启用了 JavaScript 时 加载本地 CSS 的最简单方法是什么 而且它是一个相当大的 CSS 块 所以我不想编写
  • 使用 WinHttp 发布表单

    在向服务器发布帖子之前我需要添加任何标头吗 例如 目前我正在尝试以这种方式发送请求和发布数据 LPCWSTR post L name User subject Hi message Hi if WinHttpSendRequest hReq
  • 微软图表:透明度

    我想要一个具有透明背景的图表 因此 PNG 似乎是一个不错的选择 但是当我设置透明背景时 轴标签的质量急剧下降 我该如何解决 请参阅以下代码 就目前情况而言 图表具有透明背景 正如我所希望的那样 但文本质量很差 如果我注释掉两个 Color
  • 使用 Windows 窗体在脚本终止后几分钟锁定 PowerShell ISE

    我这里有一个有趣的问题 我正在创建一个日历选择器 供我们创建帐户时使用 它工作正常并且仍在进行中 但我注意到当我在 powershell ISE 中运行脚本时 几分钟后它会锁定 我可以在此之前编辑并保存代码几分钟 事件日志中没有任何内容 我