Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Переименование файлов с заменой символов по маске

Ответить
Настройки темы
CMD/BAT - [решено] Переименование файлов с заменой символов по маске

Новый участник


Сообщения: 11
Благодарности: 1

Профиль | Отправить PM | Цитировать


Здравствуйте!
Нужно очень сделать батничек, который переименовывает файлы PDF, а конкретнее заменяет в названиях существующих файлов символы " ", "_","+","=","&" на "-".
Я сделал что так что бы заменял только один символ, а вот как подставит регулярное выражение не пойму.

renamer.bat:
Код: Выделить весь код
for %%g in (*.pdf) do call :s_subroutine "%%~nxg" "%%g"
:s_subroutine
set _sss=%1
set _ddd=%_sss:_=-%
ren %2 %_ddd%
goto :eof
set _ddd=%_sss:_=-% вот эта строка заменяет все символы "_" на символ "-", а вот как здесь пристроить регулярное выражение мне не понятно.

Спасибо.
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:43, 25-01-2010

 

Аватара для gora

Ушёл из жизни


Сообщения: 6021
Благодарности: 3491

Профиль | Отправить PM | Цитировать


Цитата El Sanchez:
хорошее решение поиска определенного символа в имени файла »
К сожалению на тильде он не сработал Спец. символ однако. А вообще применение спец. символов в именах, а тем более их умышленное туда добавление - поиск приключений на свою "нижнюю голову". ИМХО.


mozg777, исправил, попробуйте так.
Код: Выделить весь код
:_Func
	Set FileName=%~n1
	If Not "%FileName:~5%"=="" If Not "%FileName:~6,2%"=="~~" Ren "%Source%\%FileName%%~x1" "%FileName:~0,6%~~%FileName:~6%%~x1"
Это сообщение посчитали полезным следующие участники:

Отправлено: 14:11, 04-02-2011 | #31



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Цитата gora:
К сожалению на тильде он не сработал »
в данном случае можно обойти:
Код: Выделить весь код
Set "FN=%FileName:*~~=%"
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:56, 04-02-2011 | #32


Новый участник


Сообщения: 7
Благодарности: 0

Профиль | Отправить PM | Цитировать


2gora: Спасибо!, Работает!
2 El Sanchez - Эффект повторения в некоторых файлах остался

Отправлено: 08:04, 07-02-2011 | #33


Новый участник


Сообщения: 7
Благодарности: 0

Профиль | Отправить PM | Цитировать


Комрады! Выручате!
Получаемый отчет вручную не импортируется в программу, необходимо его привести к другому виду

получаю файл 7420_Fil_AngANGARSK_D2011-01-21.csv (обычный текстовой)

внутри

"branchno","store","country","period","hour","zone","customers - incoming","customers - outgoing"
"AngANGARSK","203 Ecco-geox","Russian Federation","2011-01-21","09:00","Floor 1, main1","7","3"
"AngANGARSK","203 Ecco-geox","Russian Federation","2011-01-21","11:00","Floor 1, main1","","1"
"AngANGARSK","203 Ecco-geox","Russian Federation","2011-01-21","12:00","Floor 1, main1","9","10"
"AngANGARSK","203 Ecco-geox","Russian Federation","2011-01-21","13:00","Floor 1, main1","10","7"
"AngANGARSK","203 Ecco-geox","Russian Federation","2011-01-21","14:00","Floor 1, main1","12","10"
"AngANGARSK","203 Ecco-geox","Russian Federation","2011-01-21","15:00","Floor 1, main1","9","14"
"AngANGARSK","203 Ecco-geox","Russian Federation","2011-01-21","16:00","Floor 1, main1","19","11"
"AngANGARSK","203 Ecco-geox","Russian Federation","2011-01-21","17:00","Floor 1, main1","16","16"
"AngANGARSK","203 Ecco-geox","Russian Federation","2011-01-21","18:00","Floor 1, main1","7","10"
"AngANGARSK","203 Ecco-geox","Russian Federation","2011-01-21","19:00","Floor 1, main1","15","11"
"AngANGARSK","203 Ecco-geox","Russian Federation","2011-01-21","20:00","Floor 1, main1","10","6"


нужно привести к виду

storeid, shopname, branchno, date, location, time, in-coming, out-going
7420,203 Ecco-geox,AngANGARSK,2011-01-21,Main1,09:00,7,3
7420,203 Ecco-geox,AngANGARSK,2011-01-21,Main1,11:00,0,1
7420,203 Ecco-geox,AngANGARSK,2011-01-21,Main1,12:00,9,10
7420,203 Ecco-geox,AngANGARSK,2011-01-21,Main1,13:00,10,7
7420,203 Ecco-geox,AngANGARSK,2011-01-21,Main1,14:00,12,10
7420,203 Ecco-geox,AngANGARSK,2011-01-21,Main1,15:00,9,14
7420,203 Ecco-geox,AngANGARSK,2011-01-21,Main1,16:00,19,11
7420,203 Ecco-geox,AngANGARSK,2011-01-21,Main1,17:00,16,16
7420,203 Ecco-geox,AngANGARSK,2011-01-21,Main1,18:00,7,10
7420,203 Ecco-geox,AngANGARSK,2011-01-21,Main1,19:00,15,11
7420,203 Ecco-geox,AngANGARSK,2011-01-21,Main1,20:00,10,6

То есть первую строку заменяем полностью, в остальных первый параметр берем из имени файла, удаляем все кавычки, остальное как душе угодно. Хочется универсальности, так как такого вида пять файлов.

Последний раз редактировалось mozg777, 10-02-2011 в 07:24.


Отправлено: 07:17, 10-02-2011 | #34


Старожил


Сообщения: 175
Благодарности: 119

Профиль | Отправить PM | Цитировать


Боюсь, средствами cmd универсальности добиться тяжело. По крайней мере, я не вижу приемлимого пути. Но конкретную задачу решить просто:
Код: Выделить весь код
@echo off

setlocal enabledelayedexpansion

set "FileName=7420_Fil_AngANGARSK_D2011-01-21.csv"

echo storeid,shopname,branchno,date,location,time,in-coming,out-going>%FileName%_
for /f "skip=1 tokens=1-2,4-5,7-9 delims=," %%a in (%FileName%) do (
   set "pre=%FileName:~0,4%,%%~b,%%~a,%%~c,%%e,%%~d,%%~f,%%~g"
   set "pre=!pre:, =,!" & set "pre=!pre:"=!"
   echo !pre:,,=,0,!>>%FileName%_
)
ren %FileName% %FileName:~0,-4%.bak
ren %FileName%_ %FileName%

Отправлено: 10:53, 10-02-2011 | #35


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Цитата mozg777:
Хочется универсальности »
вариант на AWK:
Код: Выделить весь код
@echo off

set $f=7420_Fil_AngANGARSK_D2011-01-21.csv
set $t=%TEMP%\%~n0.tmp

>"%$t%" echo storeid,shopname,branchno,date,location,time,in-coming,out-going
<"%$f%" >>"%$t%" awk -v FS=\",\" -v _=, ^
 "NR>1{$0=substr($0,2,length()-2);sub(/.*, */,\"\",$6);print \"%$f:~,4%\"_$2_$1_$4_$6_$5_$7_$8}"
copy "%$t%" "%$f%">nul && del "%$t%"

Отправлено: 13:42, 10-02-2011 | #36


Новый участник


Сообщения: 7
Благодарности: 0

Профиль | Отправить PM | Цитировать


универсальность в смысле имя файла может быть например 9810_Fil_ClarksFort_D2011-01-22.csv хотя здесь можно добиться универсальности только относительно даты в файле. для каждого магазина (Fil_ClarksFort) нужен свой батник.

о! Самый идеальный вариант - в цикле перебирать имена файлов в папке с расширением csv и передавать их в переменную FileName

Второй скрипт работает неправильно. включается только первая стройка и все.

Последний раз редактировалось mozg777, 11-02-2011 в 13:13.


Отправлено: 12:55, 11-02-2011 | #37


Новый участник


Сообщения: 1
Благодарности: 0

Профиль | Отправить PM | Цитировать


Помогите пожалуйста нужно чтобы в файлах (*.*) менялся символ ~ например на _

нашел тут пример:

@Echo Off
Set Source=C:\test\sed

For %%A In ("%Source%\*.*") Do Call :_Func "%%~nxA"
GoTo :EoF

:_Func
Set FileName=%~n1
Ren "%Source%\%~1" "%FileName:_=~~%%~x1"

он заменяет _ на ~~ но когда меняю на

Ren "%Source%\%~1" "%FileName:~=_%%~x1"

то не работает(

Последний раз редактировалось mazariki, 02-09-2011 в 17:40.


Отправлено: 17:23, 02-09-2011 | #38


Старожил


Сообщения: 175
Благодарности: 119

Профиль | Отправить PM | Цитировать


Цитата mazariki:
Помогите пожалуйста нужно чтобы в файлах (*.*) менялся символ ~ например на _ »
Да, с тильдой есть проблемы. Мне так и не удалось экранировать. Может кто другой знает.
Решил проблему так:
Код: Выделить весь код
@echo off

set "Source=z:\folder"

for %%i in (%Source%\*.*) do call:ReplaceAndRename "%%i"
goto:eof

:ReplaceAndRename
set "name=\%~nx1"
:loop
echo %name% | find "~" >nul && (for /f "tokens=1* delims=~" %%a in ("%name%") do set "name=%%a_%%b" & goto loop)
ren %1 "%name:~1%"
Слэш поставлен перед именем файла (set "name=\%~nx1") для корректной работы в том случае, если имя файла начинается с тильды.

PS. Пример дан с заменой тильды и в расширении. Если это не нужно - чуть-чуть надо поменять.

Последний раз редактировалось SendMessage, 03-09-2011 в 05:08. Причина: добавлен постскриптум

Это сообщение посчитали полезным следующие участники:

Отправлено: 04:58, 03-09-2011 | #39


Пользователь


Сообщения: 70
Благодарности: 1

Профиль | Отправить PM | Цитировать


Помогите с такой задачей:
есть куча файлов определенного формата в названии
???#??????#????.txt
????#??????#????.txt

Нужно символы между решетками заменить на текущее число, т.е. к примеру 0930:
????#DD0930#????.txt, поскольку перед первой решеткой кол-во символов варируется, я не могу просто отсчитать от начала кол-во символов. Между решетками кол-во символов постоянно.

Отправлено: 23:41, 29-09-2014 | #40



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Переименование файлов с заменой символов по маске

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Система - [addon] Internet Explorer 8 Rus (с заменой файлов IE6) версия 14.5.3 jameszero Наборы обновлений для Windows XP/2003/Windows 7 955 22-01-2021 22:59
Система - [addon] Internet Explorer 7 Rus (с заменой файлов IE6) версия 14.5.3 jameszero Наборы обновлений для Windows XP/2003/Windows 7 1277 06-02-2015 16:30
CMD/BAT - [решено] Перемещение и удаление файлов по условию и маске VitHAK Скриптовые языки администрирования Windows 14 23-12-2013 08:57
Установка - Помогите с заменой файлов в дистрибутиве AlexThePeacemaker Microsoft Windows 2000/XP 0 12-12-2009 11:42
Разрешение записи файлов по маске Green_Fox Microsoft Windows 2000/XP 5 11-08-2006 12:35




 
Переход