Захват n-й строки из нескольких текстовых файлов для переименования соответствующего файла pdf

#batch-file #for-loop #text #command-line

#пакетный файл #для цикла #текст #командная строка

Вопрос:

Я пытаюсь создать пакетный скрипт для обработки более 50 текстовых файлов. Существуют PDF-файлы с именами, соответствующими текстовым файлам. Я пытаюсь захватить 12-ю строку из текстового файла и переименовать соответствующий ей файл PDF в содержимое всей 12-й строки. До сих пор мне удавалось делать это, ссылаясь на конкретный файл:

ДЛЯ /F «токены=1* делители =:» %%A в (‘findstr /n .* «File1.txt «‘) ВЫПОЛНИТЕ ( ЕСЛИ «%%A» равно «12» ren «File1.pdf» «%%B.pdf»)

У меня возникли проблемы с получением этой строки и ее анализом через несколько файлов. Файлы также находятся в пути к каталогу, в котором есть пробелы. Будем признательны за любую помощь!

Ответ №1:

 @echo off
pushd "your folder with spaces in name"
for /f "eol=: tokens=1,3 delims=:" %%A in (
  'findstr /n "^" *.txt ^|findstr "^[^:]*:12:"'
) do if exist "%%~nA.pdf" ren "%%~nA.pdf" "%%B"
popd
  

В первом FINDSTR перечисляется содержимое всех .Текстовые файлы. Каждая строка вывода имеет формат

 fileName:lineNumber:content
  

Второй FINDSTR сохраняет только 12-ю строку каждого файла.

FOR / F анализирует результат, извлекая имя текстового файла перед первым двоеточием и содержимое (новое имя файла) после второго двоеточия. Двоеточия недопустимы в именах файлов, поэтому я предполагаю, что в содержимом никогда не будет двоеточия.

Наконец, раздел DO проверяет, существует ли PDF, а затем переименовывает его.

Комментарии:

1. Просто пустой комментарий, который в данном случае findstr "^[^:]*:12:" может быть просто findstr ":12:" , поскольку ни имя файла, ни текст для переименования файла не могут содержать :

2. @foxidrive — Я не думаю, что это безопасное предположение. Мы не знаем, как выглядят строки 1-11, а также строки 13 и выше. Но спасибо за исправление канала.

3. Не беспокойтесь. Теперь я вижу, от чего вы защищаете другие строки, содержащие :12:

Ответ №2:

 @ECHO OFF
SETLOCAL
SET "sourcedir=U:sourcedirt w o"
FOR %%a IN ("%sourcedir%*.txt") DO IF EXIST "%%~dpna.pdf" (
 SET unchanged=Y
 FOR /f "usebackqskip=11delims=" %%b IN ("%%a") DO IF DEFINED unchanged (
  ECHO(REN "%%~dpna.pdf" "%%b.pdf"
  SET "unchanged="
 )
)
GOTO :EOF
  

Требуемые команды REN просто ECHO отредактированы в целях тестирования. После того, как вы убедились, что команды верны, измените ECHO(REN на REN , чтобы фактически переименовать файлы.

Вам нужно будет изменить настройку sourcedir в соответствии с вашими обстоятельствами.