Automatize tarefas com arquivos BAT no FreeDOS
Aqui está um guia útil para arquivos em lote no FreeDOS.
Mesmo que você nunca tenha usado o DOS antes, provavelmente conhece seu shell de linha de comando, chamado simplesmente de COMMAND.COM
. O shell COMMAND.COM
tornou-se sinônimo de DOS e, portanto, não é surpresa que o FreeDOS também implemente um shell semelhante chamado "FreeCOM" — mas denominado COMMAND.COM
assim como em outros sistemas DOS.
Mas o shell do FreeCOM pode fazer mais do que apenas fornecer um prompt de linha de comando onde você executa comandos. Se precisar automatizar tarefas no FreeDOS, você pode fazer isso usando arquivos em lote, também chamados de "arquivos BAT" porque esses scripts usam a extensão .BAT
.
Arquivos em lote são muito mais simples do que scripts que você pode escrever no Linux. Isso ocorre porque quando esse recurso foi originalmente adicionado ao DOS, há muito tempo, ele era uma forma de os usuários do DOS "agruparem" certos comandos. Não há muita flexibilidade para ramificação condicional e os arquivos em lote não suportam recursos mais avançados, como expansão aritmética, redirecionamento separado para saída padrão versus mensagens de erro, processos em segundo plano, testes, loops e outras estruturas de script comuns em scripts Linux.
Aqui está um guia útil para arquivos em lote no FreeDOS. Lembre-se de fazer referência às variáveis de ambiente envolvendo o nome da variável com sinais de porcentagem (%
), como %PATH%
. No entanto, observe que os loops FOR
usam uma construção ligeiramente diferente por motivos históricos.
Saída de impressão
Seu arquivo em lote pode precisar imprimir mensagens para o usuário, para que ele saiba o que está acontecendo. Use a instrução ECHO
para imprimir mensagens. Por exemplo, um arquivo em lote pode indicar que uma tarefa foi concluída com esta instrução:
ECHO Done
Você não precisa de aspas na instrução ECHO
. A instrução FreeCOM ECHO
não tratará aspas de nenhuma maneira especial e as imprimirá como texto normal.
Normalmente, o FreeDOS imprime cada linha do arquivo em lote à medida que os executa. Isso geralmente não é um problema em um arquivo em lote muito curto que define apenas algumas variáveis de ambiente para o usuário. Mas para arquivos em lote mais longos que realizam mais trabalho, essa exibição constante das linhas do lote pode se tornar incômoda. Para suprimir essa saída, use a palavra-chave OFF
na instrução ECHO
, como:
ECHO OFF
Para retomar a exibição das linhas de lote à medida que o FreeDOS as executa, use a palavra-chave ON
:
ECHO ON
A maioria dos arquivos em lote inclui uma instrução ECHO OFF
na primeira linha, para suprimir mensagens. Mas o shell ainda imprimirá ECHO OFF
na tela enquanto executa essa instrução. Para ocultar essa mensagem, os arquivos em lote geralmente usam uma arroba (@
) na frente. Esse caractere especial no início de qualquer linha em um arquivo em lote suprime a impressão dessa linha, mesmo se ECHO
estiver ativado.
@ECHO OFF
Comentários
Ao escrever qualquer arquivo em lote longo, a maioria dos programadores prefere usar comentários para se lembrar da função do arquivo em lote. Para inserir um comentário em um arquivo em lote, use a palavra-chave REM
(para observação). Qualquer coisa depois de REM
é ignorada pelo shell do FreeCOM.
@ECHO OFF
REM This is a comment
Executando um arquivo em lote "secundário"
Normalmente, o FreeCOM executa apenas um arquivo em lote por vez. No entanto, talvez seja necessário usar outro arquivo em lote para fazer determinadas coisas, como definir variáveis de ambiente que são comuns em vários arquivos em lote.
Se você simplesmente chamar o segundo arquivo em lote a partir de um arquivo em lote "em execução", o FreeCOM mudará totalmente para esse segundo arquivo em lote e interromperá o processamento do primeiro. Para executar o segundo arquivo em lote "dentro" do primeiro arquivo em lote, você precisa dizer ao shell do FreeCOM para chamar o segundo arquivo em lote com a palavra-chave CALL
.
@ECHO OFF
CALL SETENV.BAT
Avaliação condicional
Os arquivos em lote suportam uma estrutura simples de avaliação condicional com a instrução IF
. Isso tem três formas básicas:
- Testando o status de retorno do comando anterior
- Testando se uma variável é igual a um valor
- Testando se existe um arquivo
Um uso comum da instrução IF
é testar se um programa retornou com sucesso ao sistema operacional. A maioria dos programas retornará um valor zero se forem concluídos normalmente ou algum outro valor em caso de erro. No DOS, isso é chamado de nível de erro e é um caso especial do teste IF
.
Para testar se um programa chamado MYPROG
foi encerrado com sucesso, você realmente deseja examinar se o programa retornou um nível de erro "zero". Use a palavra-chave ERRORLEVEL
para testar um valor específico, como:
@ECHO OFF
MYPROG
IF ERRORLEVEL 0 ECHO Success
Testar o nível de erro com ERRORLEVEL
é uma maneira desajeitada de examinar o status de saída de um programa. Uma maneira mais útil de examinar diferentes códigos de retorno possíveis para um programa DOS é com uma variável especial que o FreeDOS define para você, chamada ERRORLEVEL
. Isso armazena o nível de erro do programa executado mais recentemente. Você pode então testar valores diferentes usando o teste ==
.
Você pode testar se uma variável é igual a um valor usando o teste ==
com a instrução IF
. Como algumas linguagens de programação, você usa ==
para comparar diretamente dois valores. Normalmente, você fará referência a uma variável de ambiente de um lado e a um valor do outro, mas também pode comparar os valores de duas variáveis para ver se são iguais. Por exemplo, você pode reescrever o código ERRORLEVEL
acima com este arquivo em lote:
@ECHO OFF
MYPROG
IF %ERRORLEVEL%==0 ECHO Success
E outro uso comum da instrução IF
é testar se um arquivo existe e tomar medidas em caso afirmativo. Você pode testar um arquivo com a palavra-chave EXIST
. Por exemplo, para excluir um arquivo temporário chamado TEMP.DAT
, você pode usar esta linha em seu arquivo em lote:
@ECHO OFF
IF EXIST TEMP.DAT DEL TEMP.DAT
Com qualquer uma das instruções IF
, você pode usar a palavra-chave NOT
para negar um teste. Para imprimir uma mensagem se um arquivo não existe, você pode escrever:
@ECHO OFF
IF NOT EXIST TEMP.DAT ECHO No file
Execução ramificada
Uma maneira de aproveitar o teste IF
é pular para uma parte totalmente diferente do arquivo em lote, dependendo do resultado de um teste anterior. No caso mais simples, você pode querer pular para o final do arquivo em lote se um comando chave falhar. Ou você pode querer executar outras instruções se determinadas variáveis de ambiente não estiverem configuradas corretamente.
Você pode pular para diferentes partes de um arquivo em lote usando a instrução GOTO
. Isso vai para uma linha específica, chamada rótulo, no arquivo em lote. Observe que este é um salto estritamente "inicial"; a execução do arquivo em lote é iniciada no novo rótulo.
Digamos que um programa precise de um arquivo vazio existente para armazenar dados temporários. Se o arquivo não existisse, você precisaria criar um arquivo antes de executar o programa. Você pode adicionar estas linhas a um arquivo em lote para que seu programa sempre tenha um arquivo temporário com o qual trabalhar:
@ECHO OFF
IF EXIST temp.dat GOTO prog
ECHO Creating temp file...
TOUCH temp.dat
:prog
ECHO Running the program...
MYPROG
Claro, este é um exemplo muito simples. Neste caso, você pode reescrever o arquivo em lote para criar o arquivo temporário como parte da instrução IF
:
@ECHO OFF
IF NOT EXIST temp.dat TOUCH temp.dat
ECHO Running the program...
MYPROG
Iteração
E se você precisar executar a mesma tarefa em um conjunto de arquivos? Você pode iterar em um conjunto de arquivos com o loop FOR
. Este é um loop de uma linha que executa um único comando com um arquivo diferente a cada vez.
O loop FOR
usa uma sintaxe especial para a variável de iteração, que é usada de maneira diferente de outras variáveis de ambiente DOS. Para percorrer um conjunto de arquivos de texto para que você possa editar cada um deles, use esta instrução em seu arquivo em lote:
@ECHO OFF
FOR %%F IN (*.TXT) DO EDIT %%F
Observe que a variável de iteração será especificada com apenas um sinal de porcentagem (%
) se você executar esse loop na linha de comando, sem um arquivo em lote:
C:\> FOR %F IN (*.TXT) DO EDIT %F
Processamento de linha de comando
O FreeDOS fornece um método simples para avaliar quaisquer opções de linha de comando que o usuário possa ter fornecido ao executar arquivos em lote. O FreeDOS analisa a linha de comando e armazena as primeiras nove opções de arquivo em lote nas variáveis especiais %1
, %2
, .. e assim por diante até %9
. Observe que a décima primeira opção (e além) não é diretamente acessível desta forma. (A variável especial %0
armazena o nome do arquivo em lote.)
Se seu arquivo em lote precisar processar mais de nove opções, você poderá usar a instrução SHIFT
para remover a primeira opção e deslocar todas as opções para baixo em um valor. Portanto, a segunda opção se torna %1
e a décima opção se torna %9
.
A maioria dos arquivos em lote precisa mudar em um valor. Mas se precisar mudar por algum outro incremento, você pode fornecer esse parâmetro à instrução SHIFT
, como:
SHIFT 2
Aqui está um arquivo em lote simples que demonstra a mudança de um:
@ECHO OFF
ECHO %1 %2 %3 %4 %5 %6 %7 %8 %9
ECHO Shift by one ..
SHIFT 1
ECHO %1 %2 %3 %4 %5 %6 %7 %8 %9
A execução deste arquivo em lote com dez argumentos mostra como a instrução SHIFT
reordena as opções da linha de comando, de modo que o arquivo em lote agora pode acessar o décimo argumento como %9
:
C:\SRC>args 1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9
Shift by one ..
2 3 4 5 6 7 8 9 10
C:\SRC>