1

Тема: CMD/BAT: присвоение файлу .txt имя согласно его тексту

Задача такая: есть куча папок с документами в .txt формате, нужно их (документы) переименовать согласно дате и номеру написанному внутри самого документа.
Найти строки с датой и номером не составило труда:


for /f  "delims=" %b in ('findstr /r /s /B "от" C:\Downloads\!!!\*.doc') do Set name=%b

Пример формата даты и номера:

от 15 февраля 2012 года                                                                                                   № 104

Проблема в том, что строка вместе с путем файла выходит, а между датой и номером куча пробелов! Как бы это убрать? Нужно чисто дату и номер.
Подскажите кто может.

2

Re: CMD/BAT: присвоение файлу .txt имя согласно его тексту

Как-то так:

@echo off
setlocal enableextensions enabledelayedexpansion

for /f "usebackq tokens=1-2,4-7,9 delims=: " %%i in (
    `findstr.exe /r /s /c:"^от .* года *№ [0-9]*$" "C:\Песочница\011\*.txt"`
) do ren "%%i:%%j" "%%k %%l %%m %%n № %%o.txt"

endlocal
exit /b 0

3 (изменено: Nikro90, 2013-05-15 06:56:29)

Re: CMD/BAT: присвоение файлу .txt имя согласно его тексту

alexii пишет:

Как-то так:

@echo off
setlocal enableextensions enabledelayedexpansion

for /f "usebackq tokens=1-2,4-7,9 delims=: " %%i in (
    `findstr.exe /r /s /c:"^от .* года *№ [0-9]*$" "C:\Песочница\011\*.txt"`
) do ren "%%i:%%j" "%%k %%l %%m %%n № %%o.txt"

endlocal
exit /b 0

Почти, в пути к файлам есть пробелы и кодировка сбоит немного.
+ пути разные, папки бывают с двойным вложением, а некоторые файлы в основной папке лежат, а не в корне


@echo off
setlocal enableextensions enabledelayedexpansion

for /f "usebackq tokens=1-2,4-7,9 delims=: " %%i in (
    `findstr.exe /r /s /b /c:"^от .* года  *№ [0-9]*$" "C:\Downloads\!!!\*.txt"`
) do ren "%%i:%%j" "%%k %%l %%m %%n № %%o.txt"

endlocal
exit /b 0

но из за пробелов в пути к файлу или в его начальном названии получаем это:



C:\Downloads\!!!>setlocal enableextensions enabledelayedexpansion 

C:\Downloads\!!!>for /F "usebackq tokens=1-2,4-7,9 delims=: " %i in (`findstr.exe /r /s /b /c:"^от .* года *№ [0-9]*$" "C:\Downloads\!!!\*.txt"`) do ren "%i:%j" "%k %l %m %n № %o.txt" 

C:\Downloads\!!!>ren "C:\Downloads\\!!!\r20120215_101\№" "от 15 февраля 2012 № №.txt" 

C:\Downloads\!!!>ren "C:\Downloads\\!!!\r20120215_107\№" "от 25 января 2012 № №.txt" 

C:\Downloads\!!!>ren "C:\Downloads\\!!!\Новая" "103.txt от 15 февраля № года.txt" 

C:\Downloads\!!!>ren "C:\Downloads\\!!!\Новая" "104.txt от 15 февраля № года.txt" 

C:\Downloads\!!!>ren "C:\Downloads\\!!!\№" "от 15 февраля 2012 № №.txt" 

C:\Downloads\!!!>ren "C:\Downloads\\!!!\№" "от 15 марта 2012 № №.txt" 

C:\Downloads\!!!>endlocal

C:\Downloads\!!!>exit /b 0 

4 (изменено: Nikro90, 2013-05-15 12:45:42)

Re: CMD/BAT: присвоение файлу .txt имя согласно его тексту

Решено:


:m1
for /f "usebackq tokens=1 delims=" %%a in (`findstr.exe /r /s /b /c:"от .* года" "C:\Downloads\!!!\*.txt"`) do set name=%%a   <-- отправляем строку из файла в переменную %%name
for /f "usebackq tokens=1-2,3 delims=:" %%a in ('%name%') do set name1=%%c   <--  делим строку из переменной %%name на части и берем ту что с датой и номером. Отправляем эту часть в переменную %%name1
for /f "usebackq tokens=1-2,3 delims=:" %%a in ('%name%') do set name2=%%a:%%b   <--  делим строку из переменной %%name на части и берем ту что содержит путь к файлу. Отправляем эту часть в переменную %%name2
for /f "usebackq tokens=1-8* delims= " %%i in ('%name1%') do set name3=%%i %%j %%k %%l %%m %%n %%o   <--  удаляем лишние пробелы и отправляем  в переменную %%name3
find "от" "%name2%" 
if %errorlevel%==0 goto m2
goto m3
:m2
ren "%name2%" "%name1%.doc" <--  переименовываем файл согласно пути из переменной %%name2 на название согласно переменной %%name2 и меняем формат для избежания повторной обработки!
goto m1
:m3
exit

+ еще 1 батник запускаться будет по окончании работы дабы вернуть формат .txt

5

Re: CMD/BAT: присвоение файлу .txt имя согласно его тексту

присвойте переменную самой себе

Я конечно далек от мысли... (с)