1

Я новичок в мире пакетных скриптов, поэтому, пожалуйста, прости меня за основные вопросы. Я учусь, потому что меня устраивают на разные должности, и я большой сторонник автоматизации, где это возможно. У меня есть несколько командных файлов, которые выполняют несколько задач. У каждого из этих файлов были жестко запрограммированы пути, например, c:\temp. d:\data и т. д. в командном файле. Первоначально я переместил их в текстовый файл, который я мог вызвать из командного файла, например

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

Файл config.txt содержит эти значения

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

Я понял, что каждый раз, когда мне нужно будет создать новую переменную, мне нужно будет обновлять файл config.txt, а также файлы config.bat.

Я решил перенести все значения в файл config.bat следующим образом

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

Затем я обновил каждый из существующих пакетных файлов для вызова переменных, а не жестко заданных путей. Я также добавил следующие строки кода в каждый пакетный файл, кроме config.bat. Единственная дополнительная строка, добавленная в файл config.bat, это @echo off .

@echo off    

setlocal enableextensions enabledelayedexpansion

call config.bat

Затем у меня есть другой командный файл, который централизованно вызывает все командные файлы в последовательности. Имя этого пакетного файла - start.bat. Причина, по которой я использую start /wait состоит в том, что были случаи, когда delete.bat до того, как compress.bat имел возможность завершить работу.

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

Вопросы

  1. Это лучший способ централизовать ценности, а если нет, то как лучше?
  2. Нужно ли указывать setlocal enableextensions enabledelayedexpansion во всех существующих пакетных файлах?
  3. Во всех пакетных файлах @echo должен быть отключен или этого достаточно для файла config.bat?
  4. Является ли start /wait лучшим способом вызова нескольких файлов? Могу ли я передать значения из одного пакетного файла в другой с помощью указанной команды?
  5. Все командные файлы имеют разные функции, например, перемещение, удаление и т.д., Но используют %% a или %% b. Это нормально?

Например

Файл validate.bat имеет код

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

и delete.bat file имеет код

for %%a in (%bdata%\*.*) do if "%%~xa" == ".txt" del "%%a"

1 ответ1

1
  1. Это неплохо, но если внешние пакетные файлы просты, вы можете просто поместить их код в основной пакетный файл в виде подпрограмм и просто вызвать их метки. Например:

    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. Вам нужны только enableextensions и / или enabledelayedexpansion если вы собираетесь их использовать. Я не знаю, что у вас есть в ваших пакетных файлах, но если вы этого не сделаете, вы можете их пропустить.

  3. Вам не нужно использовать их во внешних пакетных файлах, если вы можете использовать их из другого, который отключает эхо, но это просто хорошая привычка включать его в качестве стандартного заголовка, особенно для пакетных файлов, которые вы можете вызывать с помощью сами (например, вызовом compress.bat из командной строки вручную). Существует очень мало сценариев, в которых вы бы хотели / не хотели включать его.

  4. Вы можете использовать start /wait , но простой вызов внешнего файла автоматически ожидает его возврата по умолчанию, поэтому в этом нет необходимости. Вы обычно хотите использовать его при вызове программы с графическим интерфейсом из пакетного файла. Кроме того, вызов start усложняет передачу аргументов в целевую программу, а не просто call их.

  5. Более чем вероятно, да. Параметры цикла являются локальными по отношению к циклу for , поэтому другой пакетный файл не увидит их, если у них не будет цикла for , и даже тогда, только в самом цикле:

    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>
    

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .