Arquivo de lote - Batch file

Arquivo de lote
Arquivo em lote icon.png
Extensões de nome de arquivo .bat, .cmd,.btm
Tipo de mídia da Internet
Tipo de formato Scripting
Recipiente para Scripts

Um arquivo em lote é um arquivo de script em DOS , OS / 2 e Microsoft Windows . Consiste em uma série de comandos a serem executados pelo interpretador de linha de comando , armazenados em um arquivo de texto simples . Um arquivo de lote pode conter qualquer comando do intérprete aceita de forma interativa e construções de uso que permitem a ramificação condicional e looping dentro do arquivo batch, tais como IF, FORe GOTO etiquetas . O termo "lote" vem do processamento em lote , significando "execução não interativa", embora um arquivo em lote possa não processar um lote de vários dados.

Semelhante ao Job Control Language (JCL), DCL e outros sistemas em sistemas mainframe e minicomputador, arquivos em lote foram adicionados para facilitar o trabalho necessário para certas tarefas regulares, permitindo que o usuário configure um script para automatizá-los. Quando um arquivo em lote é executado, o programa shell (geralmente COMMAND.COM ou cmd.exe ) lê o arquivo e executa seus comandos, normalmente linha por linha. Os sistemas operacionais do tipo Unix , como o Linux , têm um tipo de arquivo semelhante, mas mais flexível, chamado shell script .

A extensão de nome de arquivo .bat é usada no DOS e no Windows. Windows NT e OS / 2 também adicionaram .cmd . Os arquivos em lote para outros ambientes podem ter extensões diferentes, por exemplo, .btm em shells relacionados a 4DOS , 4OS2 e 4NT .

O tratamento detalhado de arquivos em lote mudou significativamente entre as versões. Alguns dos detalhes neste artigo se aplicam a todos os arquivos em lote, enquanto outros detalhes se aplicam apenas a certas versões.

Variantes

DOS

No DOS, um arquivo em lote pode ser iniciado a partir da interface da linha de comando digitando seu nome, seguido por quaisquer parâmetros necessários e pressionando a ↵ Entertecla. Ao carregar o DOS, o arquivo AUTOEXEC.BAT , quando presente, é executado automaticamente, de forma que quaisquer comandos que precisem ser executados para configurar o ambiente DOS podem ser colocados neste arquivo. Os usuários de computador teriam o arquivo AUTOEXEC.BAT configurando a data e hora do sistema, inicializando o ambiente DOS, carregando quaisquer programas residentes ou drivers de dispositivo ou inicializando conexões de rede e atribuições.

Uma extensão de nome de arquivo .bat identifica um arquivo que contém comandos que são executados pelo interpretador de comandos COMMAND.COM linha por linha, como se fosse uma lista de comandos inseridos manualmente, com alguns comandos extras específicos de arquivo em lote para funcionalidade de programação básica, incluindo um GOTOcomando para alterar o fluxo de execução de linha.

Windows anterior

O Microsoft Windows foi introduzido em 1985 como uma sobreposição baseada na interface gráfica do usuário (GUI) em sistemas operacionais baseados em texto e foi projetado para rodar no DOS. Para iniciá-lo, WINfoi utilizado o comando, que pode ser adicionado ao final do arquivo AUTOEXEC.BAT para permitir o carregamento automático do Windows. Nas versões anteriores, era possível executar um arquivo do tipo .bat do Windows no prompt do MS-DOS. O Windows 3.1x e anteriores, bem como o Windows 9x invocaram o COMMAND.COM para executar arquivos em lote.

OS / 2

O sistema operacional IBM OS / 2 suportava arquivos em lote no estilo DOS. Ele também incluiu uma versão do REXX , uma linguagem de script de arquivo em lote mais avançada . IBM e Microsoft começaram a desenvolver este sistema, mas durante a construção se separaram após uma disputa; como resultado disso, a IBM se referiu a seu shell de console semelhante ao DOS sem mencionar a Microsoft, nomeando-o apenas DOS, embora isso aparentemente não fizesse nenhuma diferença em relação à maneira como os arquivos em lote funcionavam no COMMAND.COM.

O interpretador de arquivo em lote do OS / 2 também suporta um comando EXTPROC. Isso passa o arquivo em lote para o programa nomeado no arquivo EXTPROC como um arquivo de dados. O programa nomeado pode ser um arquivo de script; isso é semelhante ao #! mecanismo.

Windows NT

Ao contrário do Windows 98 e anteriores, a família de sistemas operacionais Windows NT não depende do MS-DOS. O Windows NT introduziu um interpretador de comando aprimorado de 32 bits ( cmd.exe ) que pode executar scripts com a extensão .CMD ou .BAT. O cmd.exe adicionou comandos adicionais e implementou os existentes de uma maneira ligeiramente diferente, para que o mesmo arquivo em lote (com extensão diferente) pudesse funcionar de maneira diferente com cmd.exe e COMMAND.COM. Na maioria dos casos, a operação é idêntica se os poucos comandos não suportados não forem usados. As extensões do Cmd.exe para COMMAND.COM podem ser desativadas para compatibilidade.

A Microsoft lançou uma versão do cmd.exe para Windows 9x e ME chamada WIN95CMD para permitir que usuários de versões mais antigas do Windows usem certos arquivos em lote no estilo cmd.exe.

No Windows 8, cmd.exe é o interpretador de comandos normal para arquivos em lote; o COMMAND.COM mais antigo também pode ser executado em versões de 32 bits do Windows capazes de executar programas de 16 bits.

Extensões de nome de arquivo

.bastão
A primeira extensão de nome de arquivo usada pela Microsoft para arquivos em lote. Esta extensão é executada com DOS e todas as versões do Windows, em COMMAND.COM ou cmd.exe, apesar das diferentes maneiras como os dois interpretadores de comando executam arquivos em lote.
.cmd
Usado para arquivos em lote na família Windows NT e enviado para cmd.exe para interpretação. COMMAND.COM não reconhece esta extensão de nome de arquivo, portanto, os scripts cmd.exe não são executados no ambiente Windows errado por engano. Além disso, append, dpath, ftype, set, path, assoce promptcomandos, quando executado a partir de um arquivo .bat, alterar o valor da errorlevelvariável somente após um erro, enquanto que a partir de um ficheiro .cmd, eles afetariam errorlevel mesmo quando retornar sem um erro. Ele também é usado pelo OS / 2 da IBM para arquivos em lote.
.btm
A extensão usada por 4DOS , 4OS2 , 4NT e Take Command . Esses scripts são mais rápidos, especialmente com os mais longos, pois o script é carregado totalmente pronto para execução, em vez de linha por linha.

Parâmetros de arquivo em lote

COMMAND.COM e cmd.exe suportam uma série de variáveis ​​especiais ( %0, %1até %9) para se referir ao caminho e nome do trabalho em lote e os primeiros nove parâmetros de chamada de dentro do trabalho em lote, consulte também SHIFT. Parâmetros inexistentes são substituídos por uma string de comprimento zero. Eles podem ser usados ​​de forma semelhante às variáveis ​​de ambiente , mas não são armazenados no ambiente. A Microsoft e a IBM referem-se a essas variáveis ​​como parâmetros de substituição ou parâmetros substituíveis , enquanto a Digital Research, Novell e Caldera estabeleceram o termo variáveis ​​de substituição para elas. O JP Software os chama de parâmetros de arquivo em lote .

Exemplos

Este exemplo de arquivo em lote exibe Hello World!, solicita e espera que o usuário pressione uma tecla e, em seguida, é encerrado. (Observação: não importa se os comandos estão em minúsculas ou maiúsculas, a menos que funcione com variáveis)

@ECHO OFF
ECHO Hello World!
PAUSE

Para executar o arquivo, ele deve ser salvo com o sufixo de extensão de nome de arquivo .bat (ou .cmd para sistemas operacionais do tipo Windows NT) em formato de texto simples, normalmente criado usando um editor de texto como o Bloco de notas da Microsoft ou um processador de texto funcionando em modo de texto simples.

Quando executado, o seguinte é exibido:

Hello World!
Press any key to continue . . .

Explicação

O intérprete executa cada linha por vez, começando com a primeira. O @símbolo no início de qualquer linha impede que o prompt exiba aquele comando à medida que é executado. O comando ECHO OFFdesativa o prompt permanentemente ou até que seja ativado novamente. O combinado @ECHO OFFé freqüentemente, como aqui, a primeira linha de um arquivo em lote, evitando que qualquer comando seja exibido, inclusive ele. Em seguida, a próxima linha é executada e as ECHO Hello World!saídas do comando Hello World!. A próxima linha é executada e o PAUSEcomando exibe Press any key to continue . . .e pausa a execução do script. Depois que uma tecla é pressionada, o script termina, pois não há mais comandos. No Windows, se o script for executado a partir de uma janela de prompt de comando já em execução , a janela permanecerá aberta no prompt como no MS-DOS; caso contrário, a janela fecha no encerramento.

Limitações e exceções

Valores nulos em variáveis

As expansões de variáveis ​​são substituídas textualmente no comando e, portanto, as variáveis ​​que não contêm nada simplesmente desaparecem da sintaxe, e as variáveis ​​que contêm espaços se transformam em vários tokens. Isso pode levar a erros de sintaxe ou bugs.

Por exemplo, se% foo% estiver vazio, esta instrução:

IF %foo%==bar ECHO Equal

analisa como a construção errônea:

IF ==bar ECHO Equal

Da mesma forma, se %foo%contiver abc def, um erro de sintaxe diferente resultará:

IF abc def==bar ECHO Equal

A maneira usual de evitar esse problema é colocar as expansões de variáveis ​​entre aspas para que uma variável vazia se expanda para a expressão válida em IF ""=="bar"vez da inválida IF ==bar. O texto que está sendo comparado à variável também deve ser colocado entre aspas, porque as aspas não são uma sintaxe especial de delimitação; esses personagens representam a si mesmos.

IF "%foo%"=="bar" ECHO Equal

O atrasado! VARIÁVEL! a expansão disponível no Windows 2000 e posterior pode ser usada para evitar esses erros sintáticos. Nesse caso, as variáveis ​​nulas ou com várias palavras não falham sintaticamente porque o valor é expandido depois que o comando IF é analisado:

IF !foo!==bar ECHO Equal

Outra diferença no Windows 2000 ou superior é que uma variável vazia (indefinida) não é substituída. Conforme descrito nos exemplos anteriores, o comportamento do interpretador de lote anterior teria resultado em uma string vazia. Exemplo:

C:\>set MyVar=
C:\>echo %MyVar%
%MyVar%

C:\>if "%MyVar%"=="" (echo MyVar is not defined) else (echo MyVar is %MyVar%)
MyVar is %MyVar%

Os intérpretes em lote anteriores ao Windows 2000 exibiam o resultado MyVar is not defined.

Aspas e espaços nas strings passadas

Ao contrário dos processos Unix / POSIX, que recebem seus argumentos de linha de comando já divididos pelo shell em uma matriz de strings, um processo do Windows recebe a linha de comando inteira como uma única string, por meio da função API GetCommandLine . Como resultado, cada aplicativo do Windows pode implementar seu próprio analisador para dividir toda a linha de comando em argumentos. Muitos aplicativos e ferramentas de linha de comando desenvolveram sua própria sintaxe para fazer isso e, portanto, não existe uma convenção única para citar ou escapar metacaracteres nas linhas de comando do Windows.

  • Para alguns comandos, os espaços são tratados como delimitadores que separam os argumentos, a menos que esses espaços sejam colocados entre aspas. Existem várias convenções de como as aspas podem ser passadas para o aplicativo:
    • Uma convenção amplamente usada é implementada pelo analisador de linha de comando embutido na biblioteca de tempo de execução do Microsoft Visual C ++ na função CommandLineToArgvW . Ele usa a convenção de que 2 n barras invertidas seguidas por aspas (") produzem n barras invertidas seguidas por uma aspa inicial / final, enquanto (2 n ) +1 barras invertidas seguidas por aspas novamente produzem n barras invertidas seguidas por uma aspa literal A mesma convenção faz parte da especificação do .NET Framework .
      • Um aspecto não documentado é que "" ocorrendo no meio de uma string entre aspas produz uma aspa simples. (Uma mudança no CRT em 2008 [msvcr90] modificou esse tratamento não documentado de aspas.) Isso é útil para inserir aspas em um argumento sem reativar a interpretação de metacaracteres cmd como | , & e > . (cmd não reconhece o \ " usual como escape da citação. Ele reativa esses significados especiais ao ver a citação, pensando que a citação terminou.)
    • Outra convenção é que uma aspa simples ( " ) não é incluída como parte da string. No entanto, uma aspa com escape ( " "" ) pode fazer parte da string.
    • Ainda outra convenção comum vem do uso de programas portados derivados do Cygwin . Ele não diferencia entre barras invertidas que ocorrem antes ou não antes das aspas. Consulte glob (programação) § Windows e DOS para obter informações sobre esses analisadores alternativos de linha de comando.
    • Alguns comandos importantes do Windows, como cmd.exee wscript.exe, usam suas próprias regras.
  • Para outros comandos, os espaços não são tratados como delimitadores e, portanto, não precisam de aspas. Se as aspas forem incluídas, elas se tornarão parte da string. Isso se aplica a alguns comandos integrados, como echo .

Quando uma string contém aspas e deve ser inserida em outra linha de texto que também deve ser colocada entre aspas, é necessária atenção especial ao mecanismo de citação:

C:\>set foo="this string is enclosed in quotation marks"

C:\>echo "test 1 %foo%"
"test 1 "this string is enclosed in quotation marks""

C:\>eventcreate /T Warning /ID 1 /L System /SO "Source" /D "Example: %foo%"
ERROR: Invalid Argument/Option - 'string'.
Type "EVENTCREATE /?" for usage.

No Windows 2000 e posterior, a solução é substituir cada ocorrência de um caractere de aspas dentro de um valor por uma série de três caracteres de aspas:

C:\>set foo="this string is enclosed in quotes"

C:\>set foo=%foo:"="""%

C:\>echo "test 1 %foo%"
"test 1 """this string is enclosed in quotes""""

C:\>eventcreate /T Warning /ID 1 /L System /SO "Source" /D "Example: %foo%"
SUCCESS: A 'Warning' type event is created in the 'Source' log/source.

Caracteres de escape em strings

Alguns caracteres, como os caracteres pipe ( |), têm um significado especial para a linha de comando. Eles não podem ser impressos como texto usando o comando ECHO, a menos que escapados usando o símbolo circunflexo ^:

C:\>Echo foo | bar
'bar' is not recognized as an internal or external command,
operable program or batch file.

C:\>Echo foo ^| bar
foo | bar

No entanto, o escape não funciona como esperado ao inserir o caractere de escape em uma variável de ambiente. A variável acaba contendo um comando de pipe dinâmico quando simplesmente ecoado. É necessário escapar o acento circunflexo e o caractere de escape para a exibição do caractere como texto na variável:

C:\>set foo=bar | baz
'baz' is not recognized as an internal or external command,
operable program or batch file.

C:\>set foo=bar ^| baz
C:\>echo %foo%
'baz' is not recognized as an internal or external command,
operable program or batch file.

C:\>set foo=bar ^^^| baz
C:\>echo %foo%
bar | baz

O atrasado ! VARIÁVEL! A expansão disponível com CMD /V:ONou com SETLOCAL ENABLEDELAYEDEXPANSIONno Windows 2000 e posterior pode ser usada para mostrar caracteres especiais armazenados em variáveis ​​de ambiente porque o valor da variável é expandido depois que o comando foi analisado:

C:\>cmd /V:ON
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. All rights reserved.

C:\>set foo=bar ^| baz
C:\>echo !foo!
bar | baz

Dormir ou atraso programado

Até o comando TIMEOUT ser introduzido com o Windows Vista, não havia uma maneira fácil de implementar uma pausa cronometrada, pois o comando PAUSE interrompe a atividade do script indefinidamente até que qualquer tecla seja pressionada.

Muitas soluções alternativas eram possíveis, mas geralmente funcionavam apenas em alguns ambientes: o CHOICEcomando não estava disponível em versões mais antigas do DOS, PINGestava disponível apenas se o TCP / IP estava instalado e assim por diante. Nenhuma solução estava disponível da Microsoft, mas uma série de pequenos programas utilitários podiam ser instalados de outras fontes. Um exemplo comercial seria o comando Norton Utilities Batch Enhancer (BE) de 1988 , onde BE DELAY 18esperaria por 1 segundo, ou o WAIT.COM de 94 bytes onde WAIT 5esperaria por 5 segundos e então retornaria o controle para o script. A maioria desses programas são arquivos .COM de 16 bits, portanto, são incompatíveis com o Windows de 64 bits.

Saída de texto com CR / LF despojado

Normalmente, todo o texto impresso tem automaticamente os caracteres de controle para retorno de carro (CR) e avanço de linha (LF) anexados ao final de cada linha.

  • batchtest.bat
    @echo foo
    @echo bar
    
    C:\>batchtest.bat
    foo
    bar
    

Não importa se os dois comandos de eco compartilham a mesma linha de comando; os códigos CR / LF são inseridos para quebrar a saída em linhas separadas:

C:\>@echo Message 1&@echo Message 2
Message 1
Message 2

Um truque descoberto com o Windows 2000 e posterior é usar o prompt especial para entrada de texto de saída sem CR / LF no final do texto. Neste exemplo, o CR / LF não segue a Mensagem 1, mas segue a Linha 2 e a Linha 3:

  • batchtest2.bat
    @echo off
    set /p ="Message 1"<nul
    echo Message 2
    echo Message 3
    
    C:\>batchtest2.bat
    Message 1Message 2
    Message 3
    

Isso pode ser usado para enviar dados para um arquivo de texto sem CR / LF anexado ao final:

C:\>set /p ="Message 1"<nul >data.txt
C:\>set /p ="Message 2"<nul >>data.txt
C:\>set /p ="Message 3"<nul >>data.txt
C:\>type data.txt
Message 1Message 2Message 3

No entanto, não há como injetar essa saída de prompt CR / LF despojado diretamente em uma variável de ambiente.

Definir um diretório de trabalho da Convenção de Nomenclatura Uniforme (UNC) a partir de um atalho

Não é possível ter um prompt de comando que usa um caminho UNC como o diretório de trabalho atual; por exemplo\\server\share\directory\

O prompt de comando requer o uso de letras de unidade para atribuir um diretório de trabalho, o que torna mais difícil a execução de arquivos em lote complexos armazenados em um compartilhamento UNC de servidor. Embora um arquivo em lote possa ser executado a partir de um caminho de arquivo UNC, o diretório de trabalho padrão é C:\Windows\System32\.

No Windows 2000 e posterior, uma solução alternativa é usar o comando PUSHDe POPDcom extensões de comando.

Se não habilitado por padrão, as extensões de comando podem ser habilitadas temporariamente usando a /E:ONchave para o interpretador de comandos.

Portanto, para executar um arquivo em lote em um compartilhamento UNC, atribuir uma letra de unidade temporária ao compartilhamento UNC e usar o compartilhamento UNC como o diretório de trabalho do arquivo em lote, um atalho do Windows pode ser construído com a seguinte aparência:

  • Alvo: %COMSPEC% /E:ON /C "PUSHD """\\SERVER\SHARE\DIR1\DIR2\""" & BATCHFILE.BAT & POPD"

O atributo do diretório de trabalho deste atalho é ignorado.

Isso também resolve um problema relacionado ao Controle de Conta de Usuário (UAC) no Windows Vista e mais recente. Quando um administrador está conectado e o UAC está habilitado, e ele tenta executar um arquivo em lote como administrador a partir de uma letra de unidade de rede, usando o menu de contexto do arquivo clicando com o botão direito do mouse, a operação falhará inesperadamente. Isso ocorre porque o contexto de conta privilegiada do UAC elevado não tem atribuições de letras de unidade de rede e não é possível atribuir letras de unidade para o contexto elevado por meio do shell do Explorer ou scripts de logon. No entanto, ao criar um atalho para o arquivo em lote usando a construção PUSHD/ acima POPDe usando o atalho para executar o arquivo em lote como administrador, a letra da unidade temporária será criada e removida no contexto de conta elevada e o arquivo em lote funcionará corretamente .

A sintaxe a seguir se expande corretamente para o caminho do script de lote atual.

%~dp0

Os caminhos padrão UNC são desativados por padrão, pois costumavam travar programas mais antigos.

O valor do Registro Dword DisableUNCCheckem HKEY_CURRENT_USER\Software\Microsoft\Command Processorpermite que o diretório padrão seja UNC. CDO comando se recusará a mudar, mas colocará um caminho UNC no diretório padrão em um atalho para o Cmd ou usando o comando Iniciar. (o compartilhamento é para administradores). start "" /d \\127.0.0.1\C$ "cmd /k"C$

Conjunto de caracteres

Os arquivos em lote usam um conjunto de caracteres OEM, conforme definido pelo computador, por exemplo, página de código 437 . As partes não ASCII deles são incompatíveis com os conjuntos de caracteres Unicode ou Windows usados ​​de outra forma no Windows, portanto, é necessário ter cuidado. Nomes de arquivos diferentes do inglês funcionam apenas se inseridos por meio de um editor compatível com o conjunto de caracteres DOS. Nomes de arquivos com caracteres fora desse conjunto não funcionam em arquivos em lote.

Para obter saída em Unicode em canais de arquivo de um comando interno, como dir, pode-se usar o cmd /Ucomando. Por exemplo, cmd /U /C dir > files.txtcria um arquivo contendo uma listagem de diretório com os caracteres corretos do Windows, na codificação UTF-16 LE.

Vírus e malware em lote

Como acontece com qualquer outra linguagem de programação, os arquivos em lote podem ser usados ​​de forma mal-intencionada. Trojans simples e bombas bifurcadas são facilmente criados, e arquivos em lote podem fazer uma forma de envenenamento de DNS , modificando o arquivo hosts . Os vírus em lote são possíveis e também podem se espalhar por meio de unidades flash USB usando o recurso Autorun do Windows .

O seguinte comando em um arquivo em lote excluirá todos os dados no diretório (pasta) atual - sem primeiro pedir confirmação:

del /Q *.*

Esses três comandos são uma bomba de bifurcação simples que se replicará continuamente para esgotar os recursos disponíveis do sistema, desacelerando ou travando o sistema:

:TOP
 start "" %0
 goto TOP

Outras linguagens de script do Windows

O processador de comando cmd.exe que interpreta arquivos .cmd é compatível com todas as versões de 32 e 64 bits do Windows até pelo menos o Windows 10. COMMAND.EXE, que interpreta arquivos .BAT, era compatível com todos os arquivos 16 e 32- versões de bits até pelo menos Windows 10.

Existem outras linguagens de script mais recentes e poderosas disponíveis para Windows. No entanto, eles exigem que o intérprete de linguagem de script seja instalado antes de serem usados:

  • KiXtart ( .kix ) - desenvolvido por um funcionário da Microsoft em 1991, especificamente para atender à necessidade de comandos úteis em um script de logon de rede, mantendo a 'sensação' simples de um arquivo .cmd.
  • Windows Script Host ( .vbs , .js e .wsf ) - lançado pela Microsoft em 1998 e consistindo em cscript.exe e wscript.exe, executa scripts escritos em VBScript ou JScript . Ele pode executá-los no modo de janela (com o host wscript.exe) ou no modo baseado em console (com o host cscript.exe). Eles fazem parte do Windows desde o Windows 98 .
  • PowerShell ( .ps1 ) - lançado em 2006 pela Microsoft e pode operar com Windows XP (SP2 / SP3) e versões posteriores. O PowerShell pode operar interativamente (a partir de uma interface de linha de comando) e também por meio de scripts salvos, e tem uma forte semelhança com shells Unix .
  • Linguagens de script de shell do estilo Unix podem ser usadas se uma ferramenta de compatibilidade do Unix, como Cygwin , estiver instalada.
  • Ferramentas de script de plataforma cruzada incluindo Perl , Python , Ruby , Rexx , Node.js e PHP estão disponíveis para Windows.

Os arquivos de script são executados se o nome do arquivo sem extensão for inserido. Existem regras de precedência que regem a interpretação de, digamos, DoThisse DoThis.com, DoThis.exe, DoThis.bat, DoThis.cmd, etc. existir; por padrão, DoThis.comtem a prioridade mais alta. Esta ordem padrão pode ser modificada em sistemas operacionais mais novos pela variável de ambiente PATHEXT definida pelo usuário .

Veja também

Notas

Referências

links externos