更改代码后,PowerShell ISE 有时会出现不可预测的行为

2024-01-03

我正在使用 PowerShell ISE(PS 版本 5.0)。如果我运行这段代码:

Write-Host "This"

它输出:

This

如果我像这样修改脚本:

Write-Host "That"

它输出:

That

伟大的。正如预期的那样。现在,如果我有这段代码:

$Form = New-Object System.Windows.Forms.Form
$Timer = New-Object System.Windows.Forms.Timer

$Timer.Add_Tick(
{
    &{
    Write-Output "Here"
    $Form.Close()} | Write-Host 
})

$Timer.Interval = 3000
$Timer.start()
$result = $Form.ShowDialog()

它输出:

Here

如果我改变anything在脚本中,例如"Here" to "There" or $Timer.Interval = 3000 to $Timer.Interval = 4000并运行它,它做了两个意想不到的事情:1.)它没有在适当的时间内显示表单,而是在屏幕上短暂闪烁,2.)它输出原始内容Here代替There。如果我关闭 ISE 并重新打开它,脚本将按预期运行。

到底是怎么回事?


tl;dr:

  • The 定时器实例被创建在session scope,

    • 无论您是否在 ISE 中运行脚本,
    • 以及引用它的任何变量是否在范围内。
  • 始终丢弃计时器(或者至少禁用它)以防止它生成更多事件。

  • 一般来说- 虽然那是not造成当前问题的原因 - 请注意在 ISE 中运行脚本隐式点源 it,以便重复执行运行在same范围,具有先前变量值挥之不去,这可能会导致意外的行为。


您的代码永远不会处理(或禁用)计时器,因此:

  • 整个过程中都保持存活状态session,无论变量是否引用它

  • 继续generate events,

  • 但他们只fire而一个正在显示表单.

这解释了您的症状:排队,原创事件火即刻一旦您显示表格again.

解决办法是处理计时器一旦它履行了职责并触发了事件(一次):

Add-Type -AssemblyName System.Windows.Forms

$Form = New-Object System.Windows.Forms.Form
$Timer = New-Object System.Windows.Forms.Timer

$Timer.Add_Tick({
    & {
      Write-Output "Here"
      $Form.Close()
    } | Write-Host 
})

$Timer.Interval = 3000
$Timer.Start()
$result = $Form.ShowDialog()
$Timer.Dispose() # IMPORTANT: Dispose of the timer so it won't generate more events.

即使使用上述 ISE 的隐式源行为,重复调用此代码也能按预期工作。

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

更改代码后,PowerShell ISE 有时会出现不可预测的行为 的相关文章

  • 是否可以从 nuget powershell 设置项目的输出路径属性?

    我想从 nuget powershell 控制台设置 Visual Studio 项目属性 输出路径 怎么可能呢 我已经发现一篇博文 http weblogs asp net soever archive 2011 05 15 set th
  • 脚本块上的新闭包

    考虑这段代码 PS gt timer New Object Timers Timer PS gt timer Interval 1000 PS gt i 1 PS gt Register ObjectEvent timer Elapsed
  • 在Windows中根据修改日期删除数百万个文件的最有效方法

    目标 使用脚本运行 500 万至 1000 万个 XML 文件并评估其日期 如果超过 90 天则删除该文件 该脚本将每天运行 问题 使用 powershell Get ChildItem recurse 会导致脚本锁定并无法删除任何文件 我
  • 如何从powershell获取主机名?

    我如何获得hostname https stackoverflow com q 42014215 262852 for dur来自 powershell PS home thufir powershell gt PS home thufir
  • 是否可以在 PowerShell 中使 IndexOf 不区分大小写?

    我在终端服务器中由查询会话命令组成的数组中搜索索引时遇到问题 这是有问题的脚本 Array of logged users in terminal servers a Get RDUsersession CollectionName BLA
  • 如何在 Azure PowerShell 函数中导入模块?

    我尝试从函数查询天蓝色表 使用 Get AzTableRow 在我的笔记本电脑上工作得很好 但模块 aztable 不存在于天蓝色功能中 因此我得到的只是红屏 有办法安装吗 谢谢 大卫 您无需自行在 Azure Function 中安装 A
  • EWS - 访问共享日历项目/约会

    我正在尝试获取共享日历的所有项目 我已关注EWS 访问所有共享日历 https stackoverflow com questions 23766747 ews access all shared calendars 23773834 23
  • Powershell,如何添加共享文件夹的权限

    我有以下创建共享文件夹的代码 if Test Path c myFolder New Item Path c myFolder ItemType Directory If GET WMIOBJECT Win32 Share Filter N
  • PowerShell 中哈希表的并集和交集

    In PowerShell 中的并集和交集 https stackoverflow com questions 8609204 union and intersection in powershell描述了用于数组集合操作的酷单行代码 我想
  • 当存在另一个参数时在 PowerShell 中需要参数

    到目前为止我读到的所有内容都告诉我这应该有效 这是一个用于自动从 AD 帐户转出的脚本 我希望它的工作方式是 如果设置了 TransferHomeDrive 开关 那么它将需要旧服务器和新服务器的名称 我相信我应该能够通过参数集来做到这一点
  • 如何使用PowerShell批量调用Update-Database

    我们使用 Azure 弹性池生成多个客户端数据库和一个引用客户端数据库的主数据库 我们已经拥有多个数据库 并且正在开发新版本的代码 我们使用 EF6 代码优先 当我们更改模型 添加属性 时 我们创建迁移文件并需要调用Update Datab
  • 查找“未找到身份”的角色分配的可靠方法是什么?在 Azure 上使用 Powershell?

    如果您在 Azure 中分配角色 然后在删除角色分配之前删除该身份 则会出现 找不到身份 的情况 健康 状况 它是无害的 但它会占用角色分配空位并使角色分配列表变得混乱 我想找到并删除这些 我想这个 Get AzRoleAssignment
  • 查询计算机列表 - 输出上次登录用户和上次登录日期

    我正在创建一个脚本来从 txt 文件中检索所有计算机名称 然后对它们进行查询 计算机名 用户名 最后登录计算机的用户名 上次登录 使用的日期 这就是我所拥有的 Clear Host machines Get Content Path C U
  • 与 PowerShell CmdLets 互操作

    我一直在编写一些利用 App V 的 PowerShell Cmdlet 的实用程序 有趣的是 微软似乎只记录了 cmdlet 而不记录 Powershell 模块背后使用的 net 程序集 现在 我熟悉了 P Invoke 和 COM I
  • 如何使用 PowerShell 将多个文本文件的列合并到一个 csv 文件中?

    我有多个测量文件 每个文件包含一列数字数据 Update 该脚本应该适用于可变数量的测量文件 数据1 dat 1 0 2 0 3 0 数据2 dat 10 0 20 0 30 0 数据N dat 1 1 1 如何使用以下命令将这些数据文件合
  • 如何在 PowerShell 中键入 TAB 字符?

    Task 默认情况下 在 Windows 命令提示符中按 TAB 键将输出文件名 而在 PowerShell 中则不会执行任何操作 我希望能够在交互模式下键入 TAB 字符 而不是通过脚本 Research 我在这个网站上和通过谷歌搜索发现
  • 如何通过 *.csproject 文件查找参考路径

    我想制作一个自动化的 powershell 脚本 报告项目的引用和引用路径 当 csproj 中的提示路径未填写时 我找不到获取引用路径的方法 这是一个快速解决方案 它抓住了每一个 csproj当前目录下的文件 并检查每个引用 对于从 GA
  • “Connect-MsolService”未被识别为 cmdlet 的名称

    PSCommand commandToRun new PSCommand commandToRun AddCommand Connect MsolService commandToRun AddParameter Credential ne
  • 带有 UiPath 的 Powershell

    我正在使用 UiPath 启动 PowerShell 脚本 我需要从 UiPath 传递一个参数 首先这可能吗 其次有人有这方面的例子吗 不确定 PowerShell 脚本中的语法是什么 是否可以将参数从 UiPath 传递到终端 您的 P
  • 检查文件是否存在,然后移动它

    我正在尝试在 powershell 中编写几行代码 以检查文件是否到达特定文件夹 如果该文件存在 请将其复制到另一个文件夹 如果该文件不存在 则无需执行任何操作 到目前为止我只有复制部分 cd C Move y C myfolder csv

随机推荐