#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
в соответствии с вашими обстоятельствами.