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

Компьютерный форум 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

 

Ветеран


Contributor


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

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


Iska,
Цитата Iska:
по условию задачи ничего не сказано про постоянный префикс »
Если задача плохо формализована клиентом, приходится телепатить.
Вот попытка работать без определённого префикса. Но, опять же, приходится телепатить правило образования имени: КусокимениНомерРасширение. (скрипт 2)
Код: Выделить весь код
@Echo Off
cls
	Set "BoxIn=Z:\Box_In"
	Set "Folds="1111" "2222""

	Set "Mask=*.*"
	Set /A Max=1000
	
	Set "BoxOut=Z:\Box_In\Total"

	If Not Exist "%BoxOut%" Md "%BoxOut%"
	
	Pushd "%BoxIn%" &&(
		FOR %%d IN (%Folds%) DO (
			FOR %%f IN ("%%~dpnxd\%Mask%") DO (
				Call :RenCopy "%%~d" "%%f" "%%~nf" "%%~xf" "%BoxOut%"
			)
		)
		Popd
	)
Pause
GoTo :Eof

:RenCopy
	Set /A i=0
	Set "NewName=%~3"
:Begin
	Set /A i-=1
	Call Set "j=%%NewName:~%i%,1%%"
	2>nul Set /A j=1%j% || Set /A j=0
	If 10 LEQ %j% If %j% LEQ 19 GoTo :Begin 
	Set /A i+=1
	If %i% EQU 0 GoTo :Eof
	
	Call Set "j=%%NewName:~%i%%%"
	If /I "%j%"==%1 GoTo :Eof
	Set /A j+=%Max%
	Call Set "NewName=%%NewName:~0,%i%%%%j:~1%_%~1%~4"
	>nul Copy %2 "%~5\%NewName%"
	>nul Ren %2 "%NewName%"
GoTo :Eof
Естественно, Кусокимени не должен заканчиваться цифрой
Не очень тестировал, подозреваю, этот алгоритм можно обмануть

Цитата Iska:
пытаться выцепить значимую часть имени из произвольно взятых »
невозможно любым средством. Сначала придётся определить, что такое значимая часть.

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


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


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



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

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


Ветеран


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

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


Цитата megaloman:
невозможно любым средством. Сначала придётся определить, что такое значимая часть. »
Браво! Теперь Вы меня поняли.

Отправлено: 00:46, 18-08-2018 | #12


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата megaloman:
Если задача плохо формализована клиентом, приходится телепатить. »
Цитата megaloman:
невозможно любым средством. Сначала придётся определить, что такое значимая часть. »
Вот! И это естественно, т.к. любой алгоритм составить невозможно, если отсутствуют условия для его составления...
И да, данную задачу, можно свести к возможному минимуму ошибок, при стелепатированных условиях:
1. номера файлов присутствуют в конце имени файла или отсутствуют...
2. все цифры в конце имен файлов могут являться только счетчиком, а могут и не являться...
3. остальные цифры в именах и расширениях файлов, являются только текстовой частью.

В общем, если не стоит задачи перенумеровать счетчик файлов, а использовать существующую нумерацию:
powershell
Код: Выделить весь код
# Можно использовать абсолютный или относительный путь
$src = 'x:\абсолютный_путь\1\*','.\test\2\*' # и т.д.. Здесь астериск, в конце пути, обязателен.
$dst = '.\test\out'

dir $src -file|%{
	try{
		[int]$n = $_.basename -replace '.*\D(\d+)$','$1'
	} catch {
		$n = 0
	}
	$nname = ($_.basename -replace '\d+$') + ('_{0:D3}_' -f $n) + $_.directory.name
	ren $_.fullname ($nname + $_.extension)
}
copy $src $dst

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


Последний раз редактировалось YuS_2, 18-08-2018 в 13:24. Причина: корректировка условий и замена move на copy


Отправлено: 09:25, 18-08-2018 | #13


Ветеран


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

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


Цитата YuS_2:
1. номера файлов присутствуют в конце имени файла »
Или не присутствуют. Или присутствуют частично.

Цитата YuS_2:
2. все цифры в конце имен файлов могут являться только счетчиком. »
Или могут не являться счётчиком. И т.д., и т.п.

Потому — утром деньги чётко оговоренное и вменяемое ТЗ, вечером — стулья код. И никак иначе.
Это сообщение посчитали полезным следующие участники:

Отправлено: 10:33, 18-08-2018 | #14


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата Iska:
Или не присутствуют. Или присутствуют частично. »
Если не присутствуют, присваиваем номер 0, ничего необычного...
На счет частично - это как? Полуцифра?

Цитата Iska:
Или могут не являться счётчиком »
могут, вполне, это учтено, но этим кодом:
Код: Выделить весь код
'_{0:D3}_' -f $n
будут приведены к виду "_XXX_" и если число более трех символов, то обрезано оно не будет...

В общем, поэкспериментируйте с кодом, лучше один раз увидеть, всё же...

Цитата Iska:
утром деньги..., вечером — стулья »
- А можно наоборот?
- Можно... но деньги вперед!

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


Отправлено: 12:46, 18-08-2018 | #15


Ветеран


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

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


Цитата YuS_2:
На счет частично - это как? Полуцифра? »
В одном имени — есть, в другом имени — нет. Первым идёт (отдаётся по FindFirstFileEx()) имя без цифр (на NTFS) или какое было первым создано (на FAT'ах). И да — на PowerShell точно так же:
Скрытый текст

Начинаем искать постоянную часть имени .

Цитата YuS_2:
могут, вполне, это учтено, но этим кодом:
Код: Выделить весь код
'_{0:D3}_' -f $n
будут приведены к виду "_XXX_" и если число более трех символов, то обрезано оно не будет...
В общем, поэкспериментируйте с кодом, лучше один раз увидеть, всё же... »
Ох… В общем, почитайте тему, что ли. Лучше, действительно, один раз увидеть :
Цитата jordan_74:
Цитата Iska:
Цитата jordan_74:
Хочу создать батник, »
PowerShell Вас устроит? »
Желательно батник конечно »
Кто бы сомневался, что на PowerShell регулярками:
Цитата YuS_2:
Код: Выделить весь код
… -replace '.*\D(\d+)$','$1'
…
… -replace '\d+$') …
»
это решается на ать-два.

Отправлено: 13:21, 18-08-2018 | #16


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата Iska:
В одном имени — есть, в другом имени — нет. »
Это понятно. Непонятно это:
Цитата Iska:
присутствуют частично. »
имхо, цифры либо есть, либо их нет... а то какая-то половинчатая беременность получается

Цитата Iska:
почитайте тему, что ли »
да читал я, читал... и это:
Цитата jordan_74:
Желательно батник конечно »
тоже видел... но "желательно" - не значит "только"
да и после запуска батника, у меня он "не съел" некоторые тестовые файлы... вот и решил "поучаствовать"...
ну и собственно, батник гибридный сварганить - разве это сложно?

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


Отправлено: 13:39, 18-08-2018 | #17


Ветеран


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

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


Цитата YuS_2:
имхо, цифры либо есть, либо их нет... а то какая-то половинчатая беременность получается »
Поменяйте «либо есть, либо нет» на «где-то есть, где-то нет» — вот и будет «частично» . То есть, я под сим подразумеваю, что есть как имена с цифрами, так и без оных.

Цитата YuS_2:
ну и собственно, батник гибридный сварганить - разве это сложно? »
Не-не-не. Прямой вызов powershell.exe — это не «гибридный». Гибридный — это, например:

Отправлено: 13:50, 18-08-2018 | #18


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата Iska:
То есть, я под сим подразумеваю, что есть как имена с цифрами, так и без оных. »
Теперь понятнее, что имелось в виду, но это всё те же два состояния (либо есть, либо нет) и они учтены... я-то думал, что появилось ещё какое-то неопределенное состояние наличия цифр...

Цитата Iska:
Не-не-не. Прямой вызов powershell.exe — это не «гибридный». Гибридный — это, например: »
И в чем отличие?
Всё то же самое... по порядку ссылок:
Код: Выделить весь код
cscript //nologo //e:javascript
CScript /nologo /e:jscript
cscript /nologo /e:vbscript
- и в чем отличие вызова powershell?

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


Отправлено: 13:59, 18-08-2018 | #19


Ветеран


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

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


Цитата YuS_2:
- и в чем отличие вызова powershell? »
В том, что вызов гибридного должен выглядеть так же. То есть, наподобие:
Код: Выделить весь код
powershell.exe -File "%~0"
а вот это совсем не есть:
Цитата YuS_2:
оно и написано в виде гибрида, т.е. для cmd »
Код не передаётся в командной строке интерпретатора команд PowerShell, а содержится в самом файле, том же файле.

И как я понимаю, поскольку PowerShell исполняет файлы только с определёнными расширениями (так?), фокус провернуть не удастся.

Отправлено: 14:07, 18-08-2018 | #20



Компьютерный форум 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




 
Переход