Automação de Ambiente .Bat

0

Aprenda a criar um script Windows que instala o VS Code, 9 extensões essenciais e o Node.js — tudo com um duplo clique.

01 // Fundamentos

O que é um arquivo .BAT?

Um arquivo .BAT (Batch File) é um script de texto simples interpretado pelo Command Prompt (cmd.exe) do Windows. Cada linha é tratada como um comando a ser executado em sequência, como se você os digitasse manualmente no terminal.

⚡Automação

Execute dezenas de comandos com um único clique, sem interação manual.

📦Portabilidade

Um arquivo de texto. Funciona em qualquer Windows sem instalar nada extra.

🔁Reprodutibilidade

Configure novos ambientes de desenvolvimento em minutos, sempre da mesma forma.

🎓Aprendizado

Entender o script te faz entender como o sistema operacional funciona por baixo.

Contexto histórico: Scripts Batch existem desde o MS-DOS (1981). Mesmo com o surgimento do PowerShell e WSL, o .BAT continua sendo amplamente utilizado em ambientes corporativos e DevOps por sua simplicidade.

Comandos fundamentais que usaremos

ComandoFunçãoExemplo
@echo offOculta os comandos do outputPrimeira linha do script
echoExibe texto na telaecho Instalando…
if existVerifica se arquivo existeChecar instalação prévia
curlBaixa arquivos da internetDownload dos instaladores
start /waitExecuta e aguarda conclusãoRodar o instalador
setxDefine variáveis de ambienteConfigurar PATH
pauseAguarda tecla do usuárioExibir resultado final

02 // Metodologia

Por que aprender desta forma?

Este guia aplica princípios de Aprendizagem Baseada em Projetos (PBL) e Aprendizagem Ativa. Em vez de estudar teoria descontextualizada, você constrói algo real e útil enquanto aprende.

🧠Cognitivismo Aplicado

Aprender um conceito novo ancorando-o em algo que você já conhece (o terminal) é mais eficiente. O script .BAT conecta linha de comando → automação → DevOps em uma cadeia lógica compreensível.

🔬Metodologia: Desmembramento Progressivo

O script é apresentado bloco a bloco. Primeiro você entende cada parte, depois vê o todo. Isso evita a sobrecarga cognitiva e facilita a depuração quando algo dá errado.

🎯Ciclo de Kolb (Experiência → Reflexão → Conceito → Aplicação)

  1. Experiência concreta: Execute o script e veja o ambiente sendo configurado.
  2. Reflexão: O que aconteceu em cada etapa? Onde foi mais demorado?
  3. Conceituação: Por que winget é preferível ao download manual?
  4. Aplicação: Modifique o script para adicionar suas próprias ferramentas.

🏗️Scaffolding (Andaime Pedagógico)

O código completo vem acompanhado de comentários detalhados dentro do próprio script. Cada seção explica o quê faz e por quê — para que você possa remover os comentários conforme ganha confiança.

Dica pedagógica: Não copie e cole o script diretamente. Digite cada linha manualmente na primeira vez. A resistência muscular da digitação reforça a memória e força você a ler cada caractere com atenção.

03 // Requisitos

Pré-requisitos


01 Windows 10 (versão 1809+) ou Windows 11

Necessário para ter o winget (Windows Package Manager) disponível nativamente. Verifique com winget –version no terminal.

02 Conexão com a internet

O script faz download dos instaladores do VS Code e Node.js (~120MB no total). Use uma conexão estável.

03
Permissões de Administrador

A instalação de programas no Windows requer privilégios elevados. O script inclui verificação automática disso.

04 Nenhum VS Code instalado (opcional)

O script verifica se já existe uma instalação. Mas para fins de aprendizado, instale em um ambiente limpo para observar todo o processo.

Atenção ao Antivírus: Alguns antivírus bloqueiam scripts .BAT por padrão. Se o script for bloqueado, adicione uma exceção temporária ou execute pelo terminal com privilégios de administrador.

04 // Ferramentas

As 9 Extensões Essenciais

Entender por que cada extensão está no script é tão importante quanto instalá-la. Abaixo, cada uma com seu ID oficial para o VS Code:

ES7+ React/Redux Snippets – React

Snippets para criar componentes, hooks e estruturas React com atalhos como rfce ou useState.dsznajder.es7-react-js-snippets

ESLint – Lint

Analisa seu código em tempo real e aponta erros de sintaxe, padrões e boas práticas JavaScript.dbaeumer.vscode-eslint

Prettier – Code Formatter – Format

Formata seu código automaticamente ao salvar. Fim de debates sobre espaços vs. tabs.esbenp.prettier-vscode

Live Server – Server

Sobe um servidor local com reload automático. Essencial para ver HTML/CSS/JS em tempo real.ritwickdey.liveserver

Path Intellisense – Path

Autocompleta caminhos de arquivos nos imports — ./comp vira ./components/Button.jsx.christian-kohler.path-intellisense

JavaScript and TypeScript Language Features – JS/TS

IntelliSense nativo para JS e TS — já vem no VS Code, mas esta extensão garante a versão mais recente.vscode.typescript-language-features

Auto Rename Tag – HTML

Renomeia a tag de fechamento automaticamente ao editar a de abertura em HTML/JSX.formulahendry.auto-rename-tag

Bracket Pair Colorizer 2 – Color

Colore pares de chaves/colchetes/parênteses com cores diferentes para facilitar a leitura aninhada.CoenraadS.bracket-pair-colorizer

GitLens – Git

Sobrecarrega o Git nativo do VS Code com histórico, blame inline, comparações e muito mais.eamodio.gitlens

05 // Estrutura

Anatomia do Script

O script está organizado em 5 blocos funcionais. Compreender cada bloco permite reutilizá-lo em outros scripts futuros:

01 Cabeçalho e Configuração

@echo off e title configuram a aparência. setlocal isola variáveis para não poluir o sistema. A verificação de admin garante que as instalações não falharão por falta de permissão.

02 Download e Instalação do VS Code

Usa winget (gerenciador de pacotes nativo do Windows) para baixar e instalar o VS Code de forma silenciosa, sem janelas pop-up ou cliques manuais.

03 Instalação das Extensões

Usa code –install-extension para instalar cada extensão pelo ID. Este é o método oficial recomendado pela Microsoft.

04 Download e Instalação do Node.js

Usa winget novamente para instalar o Node.js LTS (versão de suporte de longo prazo), que inclui automaticamente o npm.

05 Verificação e Mensagem Final

Executa node –version e npm –version para confirmar que tudo foi instalado corretamente antes de encerrar.

06 // Código

O Script Completo

Crie um arquivo chamado setup-dev.bat com o conteúdo abaixo. Cada linha está comentada para facilitar o aprendizado.

Como criar o arquivo: Abra o Bloco de Notas, cole o conteúdo abaixo, vá em Arquivo → Salvar Como, mude o tipo para Todos os Arquivos e salve como setup-dev.bat

@echo off
title Setup Ambiente de Desenvolvimento Windows 11
setlocal EnableExtensions EnableDelayedExpansion
cls

:: =========================================================
:: CONFIGURACOES INICIAIS
:: =========================================================
set "LOGFILE=%~dp0setup-dev-log.txt"
echo =============================================================== > "%LOGFILE%"
echo SETUP DO AMBIENTE DE DESENVOLVIMENTO - %date% %time% >> "%LOGFILE%"
echo =============================================================== >> "%LOGFILE%"

echo ===============================================================
echo   SETUP DO AMBIENTE DE DESENVOLVIMENTO WINDOWS 11
echo ===============================================================
echo.

:: =========================================================
:: VERIFICAR ADMIN
:: =========================================================
net session >nul 2>&1
if not "%errorlevel%"=="0" (
    echo [ERRO] Execute este script como Administrador!
    echo [ERRO] Execute este script como Administrador! >> "%LOGFILE%"
    pause
    exit /b 1
)

:: =========================================================
:: VERIFICAR WINGET
:: =========================================================
where winget >nul 2>&1
if not "%errorlevel%"=="0" (
    echo [ERRO] winget nao encontrado neste sistema.
    echo [ERRO] winget nao encontrado neste sistema. >> "%LOGFILE%"
    echo Atualize o App Installer pela Microsoft Store.
    pause
    exit /b 1
)

echo [OK] winget localizado.
echo [OK] winget localizado. >> "%LOGFILE%"

:: =========================================================
:: HABILITAR POWERSHELL PARA SCRIPTS
:: =========================================================
echo.
echo [1/6] Configurando PowerShell para aceitar scripts...
echo [1/6] Configurando PowerShell para aceitar scripts... >> "%LOGFILE%"

powershell -NoProfile -ExecutionPolicy Bypass -Command "try { Set-ExecutionPolicy RemoteSigned -Scope LocalMachine -Force; Write-Output 'ExecutionPolicy LocalMachine ajustada para RemoteSigned.' } catch { Write-Output $_.Exception.Message; exit 1 }" >> "%LOGFILE%" 2>&1

if "%errorlevel%"=="0" (
    echo [OK] PowerShell configurado para aceitar scripts locais e assinados.
) else (
    echo [AVISO] Nao foi possivel ajustar LocalMachine. Tentando CurrentUser...
    echo [AVISO] Nao foi possivel ajustar LocalMachine. Tentando CurrentUser... >> "%LOGFILE%"
    powershell -NoProfile -ExecutionPolicy Bypass -Command "try { Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Force; Write-Output 'ExecutionPolicy CurrentUser ajustada para RemoteSigned.' } catch { Write-Output $_.Exception.Message; exit 1 }" >> "%LOGFILE%" 2>&1
    if "%errorlevel%"=="0" (
        echo [OK] PowerShell configurado no escopo do usuario.
    ) else (
        echo [AVISO] Falha ao configurar ExecutionPolicy. Verifique manualmente.
        echo [AVISO] Falha ao configurar ExecutionPolicy. >> "%LOGFILE%"
    )
)

:: =========================================================
:: HABILITAR DEVELOPER MODE DO WINDOWS
:: =========================================================
echo.
echo [2/6] Habilitando modo de desenvolvimento do Windows...
echo [2/6] Habilitando modo de desenvolvimento do Windows... >> "%LOGFILE%"

reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock" /t REG_DWORD /f /v "AllowDevelopmentWithoutDevLicense" /d 1 >> "%LOGFILE%" 2>&1
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock" /t REG_DWORD /f /v "AllowAllTrustedApps" /d 1 >> "%LOGFILE%" 2>&1

if "%errorlevel%"=="0" (
    echo [OK] Modo de desenvolvimento habilitado.
    echo [OK] Modo de desenvolvimento habilitado. >> "%LOGFILE%"
) else (
    echo [AVISO] Nao foi possivel habilitar o modo de desenvolvimento automaticamente.
    echo [AVISO] Nao foi possivel habilitar o modo de desenvolvimento automaticamente. >> "%LOGFILE%"
)

:: =========================================================
:: LOCALIZAR VS CODE
:: =========================================================
set "CODE_CMD="
call :FindCodeCmd

:: =========================================================
:: INSTALAR OU ATUALIZAR VS CODE
:: =========================================================
echo.
echo [3/6] Verificando Visual Studio Code...
echo [3/6] Verificando Visual Studio Code... >> "%LOGFILE%"

if defined CODE_CMD (
    echo [INFO] VS Code encontrado em: %CODE_CMD%
    echo [INFO] VS Code encontrado em: %CODE_CMD% >> "%LOGFILE%"
    echo [INFO] Tentando atualizar VS Code...
    echo [INFO] Tentando atualizar VS Code... >> "%LOGFILE%"
    winget upgrade --id Microsoft.VisualStudioCode -e --accept-package-agreements --accept-source-agreements --silent >> "%LOGFILE%" 2>&1
    if "%errorlevel%"=="0" (
        echo [OK] VS Code atualizado ou ja estava na versao mais recente.
        echo [OK] VS Code atualizado ou ja estava na versao mais recente. >> "%LOGFILE%"
    ) else (
        echo [AVISO] Nao foi possivel atualizar o VS Code agora. Seguindo...
        echo [AVISO] Nao foi possivel atualizar o VS Code agora. Seguindo... >> "%LOGFILE%"
    )
) else (
    echo [INFO] VS Code nao encontrado. Instalando...
    echo [INFO] VS Code nao encontrado. Instalando... >> "%LOGFILE%"
    winget install --id Microsoft.VisualStudioCode -e --accept-package-agreements --accept-source-agreements --silent >> "%LOGFILE%" 2>&1
    if "%errorlevel%"=="0" (
        echo [OK] VS Code instalado com sucesso.
        echo [OK] VS Code instalado com sucesso. >> "%LOGFILE%"
    ) else (
        echo [AVISO] Falha ao instalar VS Code pelo winget. O script seguira para as proximas etapas.
        echo [AVISO] Falha ao instalar VS Code pelo winget. O script seguira para as proximas etapas. >> "%LOGFILE%"
    )
)

:: tenta localizar novamente depois de instalar/atualizar
call :FindCodeCmd

if defined CODE_CMD (
    echo [OK] Comando do VS Code localizado: %CODE_CMD%
    echo [OK] Comando do VS Code localizado: %CODE_CMD% >> "%LOGFILE%"
) else (
    echo [AVISO] VS Code nao foi localizado para instalar extensoes.
    echo [AVISO] VS Code nao foi localizado para instalar extensoes. >> "%LOGFILE%"
)

:: =========================================================
:: INSTALAR / ATUALIZAR EXTENSOES DO VS CODE
:: =========================================================
echo.
echo [4/6] Verificando extensoes do VS Code...
echo [4/6] Verificando extensoes do VS Code... >> "%LOGFILE%"

if defined CODE_CMD (
    set EXTENSIONS[1]=dsznajder.es7-react-js-snippets
    set EXTENSIONS[2]=dbaeumer.vscode-eslint
    set EXTENSIONS[3]=esbenp.prettier-vscode
    set EXTENSIONS[4]=ritwickdey.LiveServer
    set EXTENSIONS[5]=christian-kohler.path-intellisense
    set EXTENSIONS[6]=formulahendry.auto-rename-tag
    set EXTENSIONS[7]=eamodio.gitlens

    for /L %%i in (1,1,7) do (
        set "EXT=!EXTENSIONS[%%i]!"
        echo ---------------------------------------------------------------
        echo [INFO] Processando extensao !EXT! ...
        echo [INFO] Processando extensao !EXT! ... >> "%LOGFILE%"

        call "%CODE_CMD%" --list-extensions | findstr /I /X "!EXT!" >nul
        if "!errorlevel!"=="0" (
            echo [INFO] Extensao !EXT! ja instalada. Atualizando...
            echo [INFO] Extensao !EXT! ja instalada. Atualizando... >> "%LOGFILE%"
            call "%CODE_CMD%" --install-extension !EXT! --force >> "%LOGFILE%" 2>&1
            if "!errorlevel!"=="0" (
                echo [OK] Extensao !EXT! verificada/atualizada.
                echo [OK] Extensao !EXT! verificada/atualizada. >> "%LOGFILE%"
            ) else (
                echo [AVISO] Nao foi possivel atualizar !EXT!. Seguindo...
                echo [AVISO] Nao foi possivel atualizar !EXT!. Seguindo... >> "%LOGFILE%"
            )
        ) else (
            echo [INFO] Extensao !EXT! nao instalada. Instalando...
            echo [INFO] Extensao !EXT! nao instalada. Instalando... >> "%LOGFILE%"
            call "%CODE_CMD%" --install-extension !EXT! >> "%LOGFILE%" 2>&1
            if "!errorlevel!"=="0" (
                echo [OK] Extensao !EXT! instalada com sucesso.
                echo [OK] Extensao !EXT! instalada com sucesso. >> "%LOGFILE%"
            ) else (
                echo [AVISO] Falha ao instalar !EXT!. Seguindo para a proxima...
                echo [AVISO] Falha ao instalar !EXT!. Seguindo para a proxima... >> "%LOGFILE%"
            )
        )
    )

    echo.
    echo [INFO] Extensoes finais encontradas:
    call "%CODE_CMD%" --list-extensions
) else (
    echo [AVISO] Etapa de extensoes ignorada porque o VS Code nao foi localizado.
    echo [AVISO] Etapa de extensoes ignorada porque o VS Code nao foi localizado. >> "%LOGFILE%"
)

:: =========================================================
:: INSTALAR OU ATUALIZAR NODE.JS LTS
:: =========================================================
echo.
echo [5/6] Verificando Node.js LTS...
echo [5/6] Verificando Node.js LTS... >> "%LOGFILE%"

where node >nul 2>&1
if "%errorlevel%"=="0" (
    echo [INFO] Node.js encontrado. Tentando atualizar...
    echo [INFO] Node.js encontrado. Tentando atualizar... >> "%LOGFILE%"
    winget upgrade --id OpenJS.NodeJS.LTS -e --accept-package-agreements --accept-source-agreements --silent >> "%LOGFILE%" 2>&1
    if "%errorlevel%"=="0" (
        echo [OK] Node.js atualizado ou ja estava na versao mais recente.
        echo [OK] Node.js atualizado ou ja estava na versao mais recente. >> "%LOGFILE%"
    ) else (
        echo [AVISO] Nao foi possivel atualizar Node.js agora. Seguindo...
        echo [AVISO] Nao foi possivel atualizar Node.js agora. Seguindo... >> "%LOGFILE%"
    )
) else (
    echo [INFO] Node.js nao encontrado. Instalando...
    echo [INFO] Node.js nao encontrado. Instalando... >> "%LOGFILE%"
    winget install --id OpenJS.NodeJS.LTS -e --accept-package-agreements --accept-source-agreements --silent >> "%LOGFILE%" 2>&1
    if "%errorlevel%"=="0" (
        echo [OK] Node.js instalado com sucesso.
        echo [OK] Node.js instalado com sucesso. >> "%LOGFILE%"
    ) else (
        echo [AVISO] Falha ao instalar Node.js.
        echo [AVISO] Falha ao instalar Node.js. >> "%LOGFILE%"
    )
)

:: atualiza PATH para a sessao atual
if exist "%ProgramFiles%\nodejs\node.exe" set "PATH=%ProgramFiles%\nodejs;%PATH%"
if exist "%ProgramFiles(x86)%\nodejs\node.exe" set "PATH=%ProgramFiles(x86)%\nodejs;%PATH%"

:: =========================================================
:: EXIBIR VERSOES E STATUS
:: =========================================================
echo.
echo [6/6] Verificando versoes instaladas...
echo [6/6] Verificando versoes instaladas... >> "%LOGFILE%"
echo.

if defined CODE_CMD (
    echo Versao do VS Code:
    call "%CODE_CMD%" --version
    echo.
)

where node >nul 2>&1
if "%errorlevel%"=="0" (
    echo Versao do Node.js:
    node --version
    echo.
    echo Versao do npm:
    npm --version
    echo.
) else (
    echo [AVISO] Node.js nao esta acessivel no PATH atual.
    echo [AVISO] Node.js nao esta acessivel no PATH atual. >> "%LOGFILE%"
)

echo ===============================================================
echo   PROCESSO FINALIZADO
echo ===============================================================
echo.
echo Log salvo em:
echo %LOGFILE%
echo.
echo Se alguma maquina ainda nao refletir as alteracoes no PATH,
echo reinicie o terminal ou a propria maquina.
echo.
pause
endlocal
exit /b 0

:: =========================================================
:: FUNCAO PARA LOCALIZAR O code.cmd / Code.exe
:: =========================================================
:FindCodeCmd
set "CODE_CMD="

if exist "%LOCALAPPDATA%\Programs\Microsoft VS Code\bin\code.cmd" (
    set "CODE_CMD=%LOCALAPPDATA%\Programs\Microsoft VS Code\bin\code.cmd"
    goto :eof
)

if exist "%ProgramFiles%\Microsoft VS Code\bin\code.cmd" (
    set "CODE_CMD=%ProgramFiles%\Microsoft VS Code\bin\code.cmd"
    goto :eof
)

if exist "%ProgramFiles(x86)%\Microsoft VS Code\bin\code.cmd" (
    set "CODE_CMD=%ProgramFiles(x86)%\Microsoft VS Code\bin\code.cmd"
    goto :eof
)

for /f "delims=" %%A in ('where code 2^>nul') do (
    set "CODE_CMD=%%A"
    goto :eof
)

goto :eof

07 // Execução

Como Executar

01 Salve o arquivo como setup-dev.bat

Use o Bloco de Notas ou qualquer editor de texto. Atenção: se você já tem o VS Code instalado, pode usá-lo! Salve com extensão .bat, não .txt.

02 Clique com o botão direito → “Executar como administrador”

Nunca dê duplo clique diretamente. Execute sempre como administrador para garantir permissões de instalação.

03 Aguarde a execução

O script levará de 5 a 15 minutos dependendo da velocidade da internet. Não feche a janela durante a execução.

04 Reinicie o computador

Após a conclusão, reinicie para garantir que o PATH do sistema seja atualizado corretamente e todos os comandos sejam reconhecidos em qualquer terminal.

O que você verá no terminal durante a execução

c:\>setup-dev.bat
===============================================================
SETUP DO AMBIENTE DE DESENVOLVIMENTO WEB + NODE.JS
===============================================================

[OK] Permissoes de administrador confirmadas.
[OK] winget disponivel.

[1/3] Instalando Visual Studio Code...
Aguarde — isso pode levar alguns minutos.
[OK] VS Code instalado com sucesso!

[2/3] Instalando extensoes do VS Code...
Instalando: ES7+ React/Redux Snippets... OK
Instalando: ESLint... OK
...

[3/3] Instalando Node.js LTS...
[OK] Node.js LTS instalado com sucesso!

Versao do Node.js: v22.14.0
Versao do npm: 10.9.2

===============================================================
AMBIENTE CONFIGURADO COM SUCESSO!
===============================================================

c:\> Pressione qualquer tecla para continuar . . .

08 // Validação

Verificando a Instalação

Após reiniciar, abra um novo terminal (cmd ou PowerShell) e execute os seguintes comandos para confirmar:

:: Verifica a versão do Node.js (esperado: v20.x.x ou v22.x.x)
node --version

:: Verifica a versão do npm
npm --version

:: Lista todas as extensões instaladas no VS Code
code --list-extensions

:: Verifica a versão do VS Code
code --version

:: Teste rápido: cria e executa um arquivo Node.js
echo console.log("Node.js funcionando!") > teste.js
node teste.js
:: Saída esperada: Node.js funcionando!

Primeiro projeto: Com tudo instalado, crie uma pasta meu-primeiro-projeto, abra com code . no terminal, crie um index.html e pressione Go Live na barra inferior do VS Code para ver o Live Server em ação!

09 // Prática

Desafios para Praticar

O verdadeiro aprendizado vem da modificação. Aqui estão desafios progressivos para aprofundar seu entendimento:

🟢 Nível 1 — Fácil

Adicione uma extensão de tema (ex: dracula-theme.theme-dracula) ao script. Encontre o ID na página da extensão no VS Code Marketplace.

🟡 Nível 2 — Médio

Adicione a instalação do Git via winget (Git.Git) antes da instalação do VS Code, com verificação se já está instalado.

🔴 Nível 3 — Difícil

Crie uma versão que lê uma lista de extensões de um arquivo extensions.txt externo e as instala em loop com o comando FOR /F.


🟣 Nível 4 — Expert

Transforme o script em um menu interativo com opções: (1) Instalar tudo, (2) Só VS Code, (3) Só Node.js, usando set /p e GOTO.

Reflexão Final: Scripts de automação são a base do DevOps e do conceito de Infrastructure as Code (IaC). Dominar .BAT hoje é o primeiro passo para entender ferramentas como Ansible, Terraform, e GitHub Actions amanhã.