С командным файлом Windows, как разбирать файл и выводить часть в один файл, частично в другую? - batch-file


1

Я программист Perl, но мне нужно сделать командный файл Windows для конкретной задачи.

script необходимо прочитать входной файл по строкам и скопировать в выходной файл. Однако, частично, он должен переключать выходные файлы.

Для чтения входного файла и вывода в файл в общем случае решение в следующей статье Джеба работает лучше всего. (Другие решения не работают хорошо, когда входные данные имеют странные символы или длинные строки) Пакетные файлы: как читать файл?

Однако я не могу заставить его работать, когда я меняю выходной файл в середине. Вероятно, проблема связана с тем, как работает DelayedExpansion.

Когда я запускаю следующий script, outfile в конце все равно a.txt, а new_variable не установлен.

@echo off
del /f/q a.txt
del /f/q b.txt
del /f/q c.txt
del /f/q out.txt

set outfile=a.txt
SETLOCAL DisableDelayedExpansion
FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ in.txt"`) do (
    set "var=%%a"
    SETLOCAL EnableDelayedExpansion
    set "var=!var:*:=!"
    IF "!%var!" == "/************************** PLUGINS SECTION *************************/" (
   set outfile=b.txt
   set new_variable=this
   echo "FOUND! Value of outfile should change to b.txt"
  )
  echo( !outfile! !var! >>!outfile!
    ENDLOCAL
)

echo Outfile:      %outfile%
echo New Variable: %new_variable%
  •  8
  •  1
  • 8 фев 2020 2020-02-08 08:06:03

1 ответ

1

Вы теряете переменные после endlocal.
Поэтому вам нужно сохранить значения над барьером endlocal.
Самый простой способ - использовать технику FOR-Endlocal.

 SETLOCAL DisableDelayedExpansion
 FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ in.txt"`) do (
    set "var=%%a"
    SETLOCAL EnableDelayedExpansion
    set "var=!var:*:=!"
    if "!var!" == "****" (
      set outfile=b.txt
      set new_variable=this
    )
  FOR /F "tokens=1,2" %%O in (!outfile! !new_variable!) DO
  (
    ENDLOCAL
    set "outfile=%%O"
    set new_variable=%%P
  )
)

Это работает, поскольку параметры %% O и %% P для цикла FOR не зависят от endlocal.
Оба значения кэшируются по барьеру.

  • 8 фев 2020 2020-02-08 08:06:03