Posso centralizar arquivos em lote de maneira mais eficiente? [fechadas]

1

Eu sou novo no mundo dos scripts em lote, então, por favor, perdoe o que pode aparecer como perguntas básicas. Eu estou aprendendo como eu recebo trabalhos diferentes e sou um grande defensor da automação, sempre que possível. Eu tenho vários arquivos em lotes que executam várias tarefas. Cada um desses arquivos teve seus caminhos codificados permanentemente. c: \ temp. d: \ data, etc no arquivo de lote. Inicialmente eu os movi para um arquivo de texto que eu poderia chamar de um arquivo de lote, por exemplo.

for /f "tokens=1,2 delims==" %%R in (config.txt) do ( 
if %%R==bdata set bdata=%%S
if %%R==cdata set cdata=%%S
)

O arquivo config.txt contém esses valores

bdata=c:\temp
cdata=d:\data

Percebi que toda vez que eu precisaria criar uma nova variável, precisaria atualizar o arquivo config.txt e os arquivos config.bat.

Eu decidi que moveria todos os valores para apenas o arquivo config.bat da seguinte forma

set bdata=c:\temp
set cdata=d:\data

Depois, atualizei cada um dos arquivos em lote existentes para chamar as variáveis, em vez dos caminhos codificados. Eu também adicionei as seguintes linhas de código a cada arquivo de lote, exceto config.bat. A única linha adicional adicionada ao arquivo config.bat é @echo off .

@echo off    

setlocal enableextensions enabledelayedexpansion

call config.bat

Eu tenho outro arquivo de lote que centraliza a chamada de todos os arquivos de lote em seqüência. O nome desse arquivo em lotes é start.bat. O motivo pelo qual estou usando start /wait é porque houve instâncias de onde o delete.bat é executado antes que compress.bat tenha a oportunidade de terminar.

start /wait compress.bat
start /wait validate.bat
start /wait delete.bat

Perguntas

  1. Essa é a melhor maneira de centralizar valores e, se não, qual é a melhor maneira?
  2. Preciso especificar setlocal enableextensions enabledelayedexpansion em todos os arquivos em lote existentes?
  3. Todos os arquivos em lote precisam ter o @echo off ou é suficiente apenas para o arquivo config.bat?
  4. A start /wait é a melhor maneira de chamar vários arquivos? Posso passar valores de um arquivo de lote para outro usando o comando mencionado?
  5. Todos os arquivos em lote têm funções diferentes, por exemplo mova, apague, etc use %% a ou %% b. Tudo bem?

Por exemplo

O arquivo validate.bat tem o código

for %%a in (%bdata%\*.*) do if "%%~xa" == "" move /Y "%bdata%\%%~xa" "%bdata%\%done%"  

e o delete.bat file tem o código

for %%a in (%bdata%\*.*) do if "%%~xa" == ".txt" del "%%a"
    
por PeanutsMonkey 29.08.2012 / 05:17

1 resposta

1
  1. Não é ruim, mas se os arquivos em lote externos forem simples, basta colocar o código deles no arquivo em lote principal como sub-rotinas e apenas chamar seus rótulos. Por exemplo:

    These four files:
    
    ::main.bat:
    @echo off
    call compress.bat …
    call validate.bat …
    call delete.bat …
    
    ::compress.bat:
    @echo off
    7z a -tzip -mx9 -blah -blah %1.zip
    
    ::validate.bat:
    @echo off
    7z t %1.zip
    
    ::delete.bat:
    @echo off
    delete "%1"
    
    
    Become one:
    
    ::main.bat:
    @echo off
    
    :start
      call compress …
      call validate …
      call delete …
    goto :eof
    
    :compress
      7z a -tzip -mx9 -blah -blah %1.zip
    goto :eof
    
    :validate
      7z t %1.zip
    goto :eof
    
    :delete.bat
      delete "%1"
    goto :eof
    
  2. Você precisa apenas de enableextensions e / ou enabledelayedexpansion se você for usá-los. Eu não sei o que você tem nos seus arquivos de lote, mas se você não é, você pode deixá-los de fora.

  3. Você não tem para usá-los nos arquivos em lote externos, se você puder fazê-los a partir de outro que desative o echo, mas é um bom hábito incluí-lo como um cabeçalho padrão, particularmente para arquivos em lote que você poderia chamar sozinhos (por exemplo, chamando compress.bat do prompt de comando manualmente). Há pouquíssimos cenários em que você especificamente deseja / precisa não incluí-lo.

  4. Você pode usar start /wait , mas simplesmente chamar um arquivo externo automaticamente espera que ele retorne por padrão, portanto, não deve ser necessário. Você geralmente deseja usá-lo ao chamar um programa GUI de um arquivo em lotes. Além disso, chamar start complica a passagem de argumentos para o programa alvo mais do que simplesmente call ing os argumentos.

  5. Mais do que provável, sim. Os parâmetros do loop são locais para o loop for , então o outro arquivo em lote não os verá, a menos que eles possuam um loop for e, mesmo assim, apenas no próprio loop:

    C:\t>type baz.bat
    @for %%a in (1) do call foobar.bat %%a
    
    C:\t>type foobar.bat
    @echo off
    echo %1
    echo %%a
    for %%a in (1) do echo %%a
    echo %%a
    
    C:\t>baz.bat
    
    C:\t>call foobar.bat 1
    1
    %a
    1
    %a
    
    C:\t>
    
por 29.08.2012 / 06:14

Tags