PowerShell: Depurando o Erro Persistente de "Chave de Fechamento Ausente" (MissingEndCurlyBrace)

Erros de análise sintática no PowerShell, especificamente o MissingEndCurlyBrace (falta de chave de fechamento "}"), podem ser extremamente frustrantes quando o código parece visualmente correto. Frequentemente, o interpretador aponta para uma linha específica onde uma instrução if ou try-catch começa, alegando que o bloco não foi fechado, mesmo quando todas as chaves estão devidamente emparelhadas.

Análise do Problema de Sintaxe

Considere um script de automação padrão para inicialização de serviços. O erro geralmente se manifesta em estruturas simples como esta:

# Verificação de dependências de ambiente
if (-not (Get-Command "npm" -ErrorAction SilentlyContinue)) {
    Write-Host "Erro: Node.js/NPM não detectado no sistema." -ForegroundColor Red
    Read-Host "Pressione Enter para sair..."
    exit 1
}

Mesmo que o bloco acima esteja sintaticamente perfeito, o PowerShell pode lançar um erro de ParserError. Isso ocorre porque o analisador do PowerShell é sensível a estados anteriores do fluxo de leitura que podem ter sido corrompidos por caracteres invisíveis, codificação inadequada ou parâmetros inválidos em comandos anteriores.

Causas Comuns e Estratégias de Resolução

1. Incompatibilidade de Codificação (Encoding)

O PowerShell (especialmente a versão 5.1 do Windows) prefere arquivos codificados em UTF-8 com BOM (Byte Order Mark). Se o script for salvo em UTF-8 simples ou em formatos legados como ANSI, o interpretador pode falhar ao identificar caracteres de controle, interpretando erroneamente o final de um bloco de código.

Para corrigir via terminal, você pode reprocessar o arquivo:

$caminhoScript = ".\setup-app.ps1"
(Get-Content -Path $caminhoScript) | Out-File -FilePath "$caminhoScript" -Encoding utf8

2. Parâmetros Inválidos em Cmdlets de Processo

Um erro comum que "quebra" o estado do analisador é o uso de valores incorretos em propriedades de inicialização. Por exemplo, no cmdlet Start-Process, o parâmetro -WindowStyle aceita apenas Normal, Hidden, Minimized ou Maximized. O uso de valores inexistentes como "NewWindow" pode causar comportamentos erráticos no processamento do script subsequente.

3. Caracteres Ocultos e Espaços em Branco

Caracteres "Non-breaking space" (ASCII 160) ou sequências de escape incompletas podem fazer com que o PowerShell ignore a chave de fechamento }. Uma técnica eficaz é reconstruir o bloco manualmente ou utilizar um editor hexadecimal para verificar se existem bytes inesperados antes da chave.

Exemplo de Script Corrigido e Robusto

Abaixo, uma versão reestruturada de um script de validação que evita armadilhas comuns de parsing:

function Iniciar-Ambiente-Desenvolvimento {
    try {
        # Validação de binário crítico
        $comandoGit = Get-Command "git" -ErrorAction SilentlyContinue
        if ($null -eq $comandoGit) {
            throw "Git não encontrado."
        }

        # Execução de processo externo com parâmetros validados
        $processParams = @{
            FilePath    = "cmd.exe"
            Arguments   = "/c echo Inicializando componentes..."
            WindowStyle = "Normal" 
            Wait        = $true
        }
        Start-Process @processParams

        if ($LASTEXITCODE -ne 0) {
            Write-Warning "O processo anterior retornou código de erro: $LASTEXITCODE"
        }
    }
    catch {
        Write-Error "Falha crítica na execução: $_"
        return $false
    }
    return $true
}

# Execução da função principal
Iniciar-Ambiente-Desenvolvimento

Diagnóstico Avançado

Se o erro persistir após a correção da codificação e dos parâmetros, utilize o tokenizador interno do PowerShell para ver como ele interpreta o arquivo:

$scriptContent = Get-Content ".\seu-script.ps1" -Raw
[System.Management.Automation.PSParser]::Tokenize($scriptContent, [ref]$null) | 
    Where-Object { $_.Type -eq "CurlyBrace" }

Este comando listará todos os tokens identificados como chaves. Se o número de tokens de abertura não coincidir com os de fechamento na saída do comando, existe um caractere de escape ou uma string não fechada (como uma aspa simples órfã) que está "engolindo" o restante do código.

Tags: PowerShell Windows-Management shell-scripting debugging utf-8

Publicado em 7-7 00:49