我正在尝试将 CI 流程从 TFS 迁移到 Azure Devops。
我设置了一个包含多个 PowerShell 任务的管道,并为它们打开了“使用 PowerShell Core”选项:
然后我运行我的管道,第一个任务失败,标题错误:
Exception setting "CursorPosition": "The handle is invalid."
之后我关闭了选项并重新运行管道。所有任务均顺利运行。
我知道,此选项在“常规”PowerShell 和 PowerShell Core (pwsh) 之间进行选择。 PowerShell Core 安装在构建服务器上,可从
PATH
访问。
构建服务器与我用于 TFS 代理的同一台 Windows Server 2016 计算机。
这个错误是什么意思? 提到了哪个句柄? 在这种情况下,PowerShell 和 PowerShell Core 之间的行为有什么区别?
这个错误是什么意思?
当脚本尝试在当前环境不可用或不支持的控制台窗口中设置光标位置时,会出现错误
Exception setting "CursorPosition": "The handle is invalid."
。这通常发生在非交互式环境中,例如构建服务器中的管道,其中没有实际的控制台窗口可供操作。
提到了哪个手柄?
本文中的“句柄”是指对系统资源的引用,特别是控制台窗口。在非交互式环境中,控制台窗口句柄可能无效或不可用,从而在尝试设置
CursorPosition
等属性时导致此错误。
在这种情况下,PowerShell 和 PowerShell Core 之间的行为有什么区别?
下表总结了 PowerShell 和 PowerShell Core 之间的主要区别:
特点 | PowerShell(Windows PowerShell 5.1) | PowerShell 核心(PowerShell 7.x) |
---|---|---|
平台支持 | 仅限Windows | 跨平台(Windows、Linux、macOS) |
依赖关系 | .NET框架 | .NET Core(跨平台,开源) |
推出为 | powershell.exe | Windows 上的 pwsh.exe 以及 MacOS 和 Linux 上的 pwsh |
您可以参考Windows PowerShell 5.1 和 PowerShell 7.x 之间的差异了解更多详细信息。
这种情况的关键区别在于,PowerShell Core 对非交互式环境中的控制台操作更加严格,导致在尝试设置诸如
CursorPosition
之类的属性时出现错误。 它必须以跨不同操作系统兼容的方式处理与控制台相关的命令。
Windows PowerShell 可能会更宽松地处理这些命令,因为它与 Windows 控制台子系统的集成更紧密。即使控制台窗口不可用,它也可能不会针对某些控制台操作抛出错误,或者可能会以不同的方式处理它们。