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

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

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

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


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

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


Добрый день! Хочу создать батник, который бы переименовывал файлы в папке и копировал их в итоговую "Total"

Есть две папки, "1" и "2" и в обеих лежат файлы c именами:
check1,check2,check3.... и т.д

Нужно чтобы нумерация начиналась с 001 и к имени добавлялся номер папки.

например check001_1, check002_1, check003_1 - это для папки "1" и например check001_2, check002_2, check003_2 - для папки "2"

файлов может быть более тысячи

Для меня это нереально(

Пробовал только переименовывать вот таким кодом

for /f "tokens=*" %%a in ('dir /b C:\Onkassa\Rename\1\*.*') do ren C:\Onkassa\Rename\1\%%a 001_1%%a

в итоге переименован только первый файл 001_1check

Отправлено: 11:24, 17-08-2018

 

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


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

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


Цитата YuS_2:
Переименование файлов осуществляется на регулярной основе? »
По одному разу 5 дней в неделю

Цитата YuS_2:
2. Перед запуском переименования, необходимо освобождать исходные и целевую папки от распакованных файлов »
да, все папки до переименования должны очищаться скриптом. После переименования должны очищаться исходные папки также скриптом. После переименования файлы из целевой папки (Total) я буду вручную переносить на другой ресурс.

Цитата YuS_2:
С какой частотой поступают архивы с чеками? Они появляются автоматически или вручную? Если автоматически, то возможна ли ситуация появления архива в процессе переименования? »
Архивы один раз в день сразу пачкой. Я скачиваю их из электронной почты. По поводу автоматом или вручную не могу сказать, надо ковыряться настройки OutLook, там должна быть возможность из нескольких писем сохранить вложение.
Новый архив в процессе переименования не появится

Отправлено: 12:41, 22-08-2018 | #61



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

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


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата jordan_74:
Ежедневно я кладу в каждую из них архивы с файлами чеков с текущей датой. И печатать я буду только чеки полученные за текущую дату.
Архивы в папках распаковываются, переименовываются файлы c указанием номера счета и даты, условно в check001_10816540044924_20180817_A и т.д
После, файлы чеков из папок А и В копируются в Total, после чего папки A и B очищаются. Папка Total очищается мной вручную, я переношу файлы на ресурс печати
Каждый новый день нумерация файлов начинается с 001 »
Так, теперь более понятно и можно сваять что-то, более-менее, подходящее:
powershell
script.ps1
Код: Выделить весь код
$src = '.\test' # корневой каталог с путем (относительным или абсолютным)
$src_sub = 'A','B' # и т.д., имена проверяемых каталогов
$dst = '.\test\total' #целевой каталог с путем (относительным или абсолютным)
$per = '407028' # постоянная составляющая номера счета. используется для разделения имени файла

function rename-file ($a,$b) {
	dir $a -file|%{
		$nname = $_.basename + ('{0:D3}' -f $k) + '_' + $b + '_' + $_.directory.parent.name
		ren $_.fullname ($nname + $_.extension)
		$k++
	}
	move "$a\*" $a.parent.fullname
	del $a
}
function expand-rename {
	begin {$k=0}
	process {
		$d = $_.directory.fullname + '\' + $_.basename
		if (!(test-path $d)){md $d|out-null}
		expand-archive $_.fullname ($fld = gi $d)
		$acn = ($_.basename -split $per)[1].split()
		rename-file $fld ($acn[0] + '_' + $acn[2])
		del $_.fullname
	}
}
$arr = dir $src -dir 

$arr|%{if($src_sub -match $_.name){dir ($_.fullname+'\*') -file -inc '*.zip'}}|expand-rename
$arr|%{if($src_sub -match $_.name){
	dir ($_.fullname+'\*') -file|sort -prop lastwritetime|%{$i=1}{
		$ename = (($tmp = $_.basename -split '(_)')[0] -replace '(?<=\D)\d+$') + `
		('{0:D3}' -f $i) + (-join $tmp[1..$tmp.count])
		ren $_.fullname ($ename + $_.extension)
		$i++
		if ($i -ge 999){
			write-warning "достигнут лимит количества файлов, проверьте исходные данные"; break
		}
	}
}
}
$arr|%{if($src_sub -match $_.name){move ($_.fullname+'\*') $dst}}
батник для запуска:
Код: Выделить весь код
@echo off
echo Выполняем...
powershell -ex bypass .\script.ps1
echo Готово.
pause
1. Входные данные: архивы с чеками с форматом имени "Расчетный счет 40702810816540044924 от 17082018"
2. Архивы после обработки удаляются
3. Пересчитываются все распакованные файлы по дате изменения, в пределах исходного каталога, т.е. отдельная нумерация в каталоге "A" (от 001 до 999) и отдельная в "B" (от 001 до 999).
4. Файлы, распакованные из архивов, после переименования перемещаются в целевой каталог.

Цитата jordan_74:
да, все папки до переименования должны очищаться скриптом. После переименования должны очищаться исходные папки также скриптом. После переименования файлы из целевой папки (Total) я буду вручную переносить на другой ресурс. »
Скрипт не чистит перед переименованием, но переносит переименованные файлы в целевую папку. Архивы скрипт удаляет.
Ну, а т.к. целевая папка чистится только вручную, то будем считать, что исходные каталоги чистые и в них ничего нет. Туда необходимо только добавить архивы и запустить скрипт.

-------
scio me nihil scire. Ѫ


Последний раз редактировалось YuS_2, 22-08-2018 в 13:17.


Отправлено: 13:04, 22-08-2018 | #62


Ветеран


Contributor


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

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


Вот решение с включением информации о счетах в именах файлов
Код: Выделить весь код
@Echo Off
cls
	Set "BoxIn=Z:\Box_In"
	Set "Folds="A" "B""
	Set "Pref=check"
	Set /A Max=1000
	
	Set "BoxOut=Z:\Box_In\Total"
	Set "OutTmp=Z:\Box_In\Total\Tmp"

	Set "Arc="C:\Program Files\7-Zip\7z.exe" e  -o"%OutTmp%""
	Set "ArcMask=*.7Z"

	If Not Exist "%BoxOut%" Md "%BoxOut%"
	If Not Exist "%OutTmp%" Md "%OutTmp%"

	Set /A Max1=%Max%-1
	FOR %%d IN (%Folds%) Do (
		If Not Exist "%BoxOut%\%%~d" Md "%BoxOut%\%%~d"
		FOR %%f IN ("%BoxIn%\%%~d\%ArcMask%") Do Call :ArcOut "%%~d" "%%~f" "%BoxOut%\%%~d"
	)
Pause
GoTo :Eof

rem Формат архива "Расчетный счет 40702810816540044924 от 16082018.7Z" Важна длина хвоста имени 

:ArcOut
	Set "NN=%~n2"
	Set "NN=%NN:~-26%
	Set "NN=%Pref%_%NN:~22,4%%NN:~20,2%%NN:~18,2%_%~1_%NN:~0,14%_"
Echo "%2"
	%Arc% "%~2" >nul
	FOR /L %%n IN (1,1,%Max1%) Do (
		Set /A MMax=%Max%+%%n
		FOR %%f IN ("%OutTmp%\%Pref%%%n.*") Do (
			Call Move /Y "%%f" "%BoxOut%\%NN%%%MMax:~1%%%%~xf" >nul
		)
	)
	Move /Y "%~2" "%~3\" >nul
	Del /Q "%OutTmp%\*.*" 2>nul
GoTo :Eof
Вы помещаете Ваши архивы в соответствующие папки.
Вот, для примера, мои файлы:

Z:\Box_In\A\Расчетный счет 40702810816540044921 от 16082018.7z
Z:\Box_In\A\Расчетный счет 40702810816540044922 от 16082018.7z
Z:\Box_In\A\Расчетный счет 40702810816540044923 от 16082018.7z

Z:\Box_In\B\Расчетный счет 40702810816540044924 от 16082018.7z
Z:\Box_In\B\Расчетный счет 40702810816540044925 от 16082018.7z
Z:\Box_In\B\Расчетный счет 40702810816540044926 от 16082018.7z

Архивы по очереди распаковываются в промежуточную папку , у меня Z:\Box_In\Total\Tmp, Ваши файлы с именами check1,2,3... с расширениями, распакованное перемещается в папку Z:\Box_In\Total с сформированными именами.
Вот мои выходные файлы для примера
Z:\Box_In\Total\check_20180816_A_10816540044921_001
Z:\Box_In\Total\check_20180816_A_10816540044921_002
Z:\Box_In\Total\check_20180816_A_10816540044921_003
Z:\Box_In\Total\check_20180816_A_10816540044921_004
Z:\Box_In\Total\check_20180816_A_10816540044921_005
Z:\Box_In\Total\check_20180816_A_10816540044921_006
Z:\Box_In\Total\check_20180816_A_10816540044921_007
Z:\Box_In\Total\check_20180816_A_10816540044921_008
Z:\Box_In\Total\check_20180816_A_10816540044921_009
Z:\Box_In\Total\check_20180816_A_10816540044921_010
Z:\Box_In\Total\check_20180816_A_10816540044922_001
Z:\Box_In\Total\check_20180816_A_10816540044922_002
Z:\Box_In\Total\check_20180816_A_10816540044922_003
Z:\Box_In\Total\check_20180816_A_10816540044922_004
Z:\Box_In\Total\check_20180816_A_10816540044922_005
Z:\Box_In\Total\check_20180816_A_10816540044922_006
Z:\Box_In\Total\check_20180816_A_10816540044922_007
Z:\Box_In\Total\check_20180816_A_10816540044922_008
Z:\Box_In\Total\check_20180816_A_10816540044922_009
Z:\Box_In\Total\check_20180816_A_10816540044922_010
Z:\Box_In\Total\check_20180816_A_10816540044923_001
Z:\Box_In\Total\check_20180816_A_10816540044923_002
Z:\Box_In\Total\check_20180816_A_10816540044923_003
Z:\Box_In\Total\check_20180816_A_10816540044923_004
Z:\Box_In\Total\check_20180816_A_10816540044923_005
Z:\Box_In\Total\check_20180816_A_10816540044923_006
Z:\Box_In\Total\check_20180816_A_10816540044923_007
Z:\Box_In\Total\check_20180816_A_10816540044923_008
Z:\Box_In\Total\check_20180816_A_10816540044923_009
Z:\Box_In\Total\check_20180816_A_10816540044923_010
Z:\Box_In\Total\check_20180816_B_10816540044924_001.txt
Z:\Box_In\Total\check_20180816_B_10816540044924_002.txt
Z:\Box_In\Total\check_20180816_B_10816540044924_003.txt
Z:\Box_In\Total\check_20180816_B_10816540044924_004.txt
Z:\Box_In\Total\check_20180816_B_10816540044924_005.txt
Z:\Box_In\Total\check_20180816_B_10816540044924_006.txt
Z:\Box_In\Total\check_20180816_B_10816540044924_007.txt
Z:\Box_In\Total\check_20180816_B_10816540044924_008.txt
Z:\Box_In\Total\check_20180816_B_10816540044924_009.txt
Z:\Box_In\Total\check_20180816_B_10816540044924_010.txt
Z:\Box_In\Total\check_20180816_B_10816540044925_001.txt
Z:\Box_In\Total\check_20180816_B_10816540044925_002.txt
Z:\Box_In\Total\check_20180816_B_10816540044925_003.txt
Z:\Box_In\Total\check_20180816_B_10816540044925_004.txt
Z:\Box_In\Total\check_20180816_B_10816540044925_005.txt
Z:\Box_In\Total\check_20180816_B_10816540044925_006.txt
Z:\Box_In\Total\check_20180816_B_10816540044925_007.txt
Z:\Box_In\Total\check_20180816_B_10816540044925_008.txt
Z:\Box_In\Total\check_20180816_B_10816540044925_009.txt
Z:\Box_In\Total\check_20180816_B_10816540044925_010.txt
Z:\Box_In\Total\check_20180816_B_10816540044926_001.txt
Z:\Box_In\Total\check_20180816_B_10816540044926_002.txt
Z:\Box_In\Total\check_20180816_B_10816540044926_003.txt
Z:\Box_In\Total\check_20180816_B_10816540044926_004.txt
Z:\Box_In\Total\check_20180816_B_10816540044926_005.txt
Z:\Box_In\Total\check_20180816_B_10816540044926_006.txt
Z:\Box_In\Total\check_20180816_B_10816540044926_007.txt
Z:\Box_In\Total\check_20180816_B_10816540044926_008.txt
Z:\Box_In\Total\check_20180816_B_10816540044926_009.txt
Z:\Box_In\Total\check_20180816_B_10816540044926_010.txt

После обработки архивы перемещаются в соответствуюжие папки, у меня Z:\Box_In\Total\A Z:\Box_In\Total\B
Z:\Box_In\Total\Tmp очищается, хотя, в принципе, там и без этого ничего не должно было оставаться, если только в Ваших архивах было что-то еще, кроме файлов Check
Как я понимаю, при таком подходе файлов типа check123_1 быть не может, ранее они появлялись из-за того, что в разных архивах имелись разные файлы с одинаковым названием.
Пропишите свои пути и уточните ключи 7Z.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 22-08-2018 в 17:31.

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

Отправлено: 17:25, 22-08-2018 | #63


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата megaloman:
Set "ArcMask=*.7Z" »
Эмм...
Цитата jordan_74:
Наименование архива выглядит следующим образом "Расчетный счет 40702810816540044924.zip" »

-------
scio me nihil scire. Ѫ

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

Отправлено: 17:56, 22-08-2018 | #64


Ветеран


Contributor


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

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


YuS_2, ом мани падме хум! Не увидел зип. Но это не принципиально. Легко изменяется. Но у меня нет зипа, отладить не на чем

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Отправлено: 19:54, 22-08-2018 | #65


Ветеран


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

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


Цитата megaloman:
Но у меня нет зипа, отладить не на чем »
Создайте его при помощи 7-Zip .

Отправлено: 20:02, 22-08-2018 | #66


Ветеран


Contributor


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

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


Iska, да создать зип можно,. Но загвоздка в том, чтобы распаковать архиватором zip - там будут свои ключи. Я с 7z убодался. Насколько всё-таки rar удобнее.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Отправлено: 20:24, 22-08-2018 | #67


Ветеран


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

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


Цитата megaloman:
Но загвоздка в том, чтобы распаковать архиватором zip - там будут свои ключи. »
Зачем? Автор темы использует именно 7-Zip для извлечения файлов.

Цитата megaloman:
Насколько всё-таки rar удобнее. »
Это да.

Отправлено: 20:48, 22-08-2018 | #68


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата megaloman:
ом мани падме хум! »
нихт ферштейн, я ничего такого не имел в виду!

-------
scio me nihil scire. Ѫ


Отправлено: 21:19, 22-08-2018 | #69


Ветеран


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

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


Цитата YuS_2:
Цитата megaloman:
ом мани падме хум! »
нихт ферштейн, »
И они ещё борятся за почётное звание дома высокой культуры быта!

Токмо классическая латынь, токмо хардкор: «Mea culpa, mea culpa».

Отправлено: 21:43, 22-08-2018 | #70



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - Переименование папки и копирование новой из сети. Lorttt Скриптовые языки администрирования Windows 19 19-06-2017 18:56
CMD/BAT - Копирование файла и переименование согласно списка из exel TPOJIb_55 Скриптовые языки администрирования Windows 4 01-06-2016 09:28
CMD/BAT - Копирование файлов из подкаталогов и их переименование в название папки lexxxyatina Скриптовые языки администрирования Windows 7 13-11-2014 09:44
CMD/BAT - [решено] Копирование и переименование файла по особой маске DARK-Silver666 Скриптовые языки администрирования Windows 5 20-12-2012 21:22
VBS/WSH/JS - [решено] переименование и копирование папки Anufriev Скриптовые языки администрирования Windows 6 22-05-2012 08:11




 
Переход