Архивирование файлов в соответствии с именами файлов

323
Guest

Ежедневно мы получаем пять таких файлов:

vi_250000364846.dqa_report.xlsx
vi_250000364846.3553_report
vi_250000364846.MSR_report
vi_250000364857.3553_report
vi_250000364857.dqa_report.xlsx

Числа в имени файла отличаются каждый день, но они будут одинаковыми для трех обязательных файлов. Мне нужно отправить эти три файла только в сжатую папку zip.

Я написал следующий код, но он использует первый файл несколько раз и отображает одно и то же значение пять раз:

@echo on  set LOGFILE=batch.log  call :LOG > %LOGFILE%  exit /B   :LOG  setlocal EnableDelayedExpansion  set n=0  set count=0  set vector[%n%]=0  for /f "tokens=* delims=." %%i in ('dir /b /a-d "C:\Test"') do (  set filename=%%i  for /f "tokens=2 delims=_." %%a in ("%filename%") do (  set vector[!n!]=%%a  for /f "tokens=* delims==" %%v in ('set vector[%n%]') do @echo %%v  )  set /A n+=1  ) 

Я не уверен, почему он не принимает второй файл в качестве параметра. Я пытаюсь создать массив чисел во всех пяти именах файлов, а затем сравнить эти значения массива.

Пожалуйста, помогите мне выяснить, где это не так.

0
Ни из вашего кода, ни из описания не ясно ** какие ** 3 файла вы хотите заархивировать. Первый `for / f` кажется ненужным, поскольку вы просто используете его для перечисления файлов, а третий неуместен; это должно быть за пределами oter for / f. LotPings 6 лет назад 0

1 ответ на вопрос

0
ShadowRanger

У вас есть пара мест, где вы использовали активное расширение (с %разделителями), где вы должны были использовать отложенное расширение (с !разделителями). Исправление, которое, кажется, получает поведение, которое вы хотите:

@echo on  set LOGFILE=batch.log  call :LOG > %LOGFILE%  exit /B   :LOG  setlocal EnableDelayedExpansion  set n=0  set count=0  set vector[%n%]=0  for /f "tokens=* delims=." %%i in ('dir /b /a-d "C:\Test"') do (  set filename=%%i  for /f "tokens=2 delims=_." %%a in ("!filename!") do (  set vector[!n!]=%%a  for /f "tokens=* delims==" %%v in ('set vector[!n!]') do @echo %%v  )  set /A n+=1  ) 

Чтобы быть ясным, изменения, которые я сделал, должны:

for /f "tokens=2 delims=_." %%a in ("%filename%") do ( 

изменился на:

for /f "tokens=2 delims=_." %%a in ("!filename!") do ( 

а также:

for /f "tokens=* delims==" %%v in ('set vector[%n%]') do @echo %%v 

изменился на:

for /f "tokens=* delims==" %%v in ('set vector[!n!]') do @echo %%v 

Без этих изменений %filename%всегда расширяется до пустой строки и %n%всегда расширяется до 0 (значение, которое было установлено при начале внешнего for); в последнем случае это только испортило ваш вывод (вы правильно использовали !n!при назначении vector, поэтому он имел правильные значения, просто вы печатали только первую запись, даже если вы добавили записи в последующие индексы).