Estou tentando migrar o processo de CI do TFS para o Azure Devops.
Configurei um pipeline com várias tarefas do PowerShell e ativei a opção "Use PowerShell Core" para elas:
Então executei meu pipeline e a primeira tarefa falhou com erro no cabeçalho:
Exception setting "CursorPosition": "The handle is invalid."
Depois disso, desliguei a opção e executei novamente o pipeline. Todas as tarefas foram executadas sem erros.
Eu sei que essa opção escolhe entre o PowerShell "regular" e o PowerShell Core (pwsh). O PowerShell Core é instalado no servidor de build e é acessível a partir de PATH
. O servidor de build é a mesma máquina Windows Server 2016 que usei para agentes TFS.
O que esse erro significa? Qual handle é mencionado? Qual é a diferença de comportamento entre PowerShell e PowerShell Core neste caso?
O erro
Exception setting "CursorPosition": "The handle is invalid."
ocorre quando um script tenta definir a posição do cursor em uma janela de console que não está disponível ou não é suportada no ambiente atual. Isso geralmente acontece em ambientes não interativos, como o pipeline no seu servidor de build, onde não há uma janela de console real para manipular.O "handle" neste contexto se refere a uma referência a um recurso do sistema, especificamente a janela do console. Em ambientes não interativos, o handle da janela do console pode ser inválido ou indisponível, levando a esse erro ao tentar definir propriedades como
CursorPosition
.Aqui está uma tabela resumindo as principais diferenças entre o PowerShell e o PowerShell Core:
Você pode consultar este documento oficial Diferenças entre o Windows PowerShell 5.1 e o PowerShell 7.x para obter mais detalhes.
A principal diferença neste caso pode ser que o PowerShell Core é mais rigoroso sobre manipulações de console em ambientes não interativos, levando a erros ao tentar definir propriedades como
CursorPosition
. Afinal, ele tem que lidar com comandos relacionados ao console de uma forma que seja compatível entre diferentes sistemas operacionais.O Windows PowerShell pode lidar com esses comandos de forma mais branda devido à sua integração mais estreita com o subsistema de console do Windows. Ele pode não gerar erros para certas manipulações de console, mesmo se a janela do console não estiver disponível, ou pode lidar com eles de forma diferente.