Показать полную графическую версию : [решено] Переименование и копирование файлов
jordan_74
17-08-2018, 11:24
Добрый день! Хочу создать батник, который бы переименовывал файлы в папке и копировал их в итоговую "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
файлов может быть более тысячи »
И что Вы хотите получить в этом случае — с трёхзначным-то:
Нужно чтобы нумерация начиналась с 001 и к имени добавлялся номер папки.
например check001_1, check002_1, check003_1 »
значением номера?!
Хочу создать батник, »
PowerShell Вас устроит?
jordan_74
17-08-2018, 12:45
И что Вы хотите получить в этом случае — с трёхзначным-то: »
Можно ограничиться до тысячи, 999
Нужно чтобы нумерация начиналась с 001 и к имени добавлялся номер папки.
например check001_1, check002_1, check003_1 » »
Именно так да
PowerShell Вас устроит? »
Желательно батник конечно
Желательно батник конечно »
Нет, я тут пас — мало желания на пакетных файлах пытаться выцепить значимую часть имени из произвольно взятых:
check1,check2,check3 »
jordan_74
17-08-2018, 13:56
Тем не менее благодарю за попытку!!
megaloman
17-08-2018, 14:19
Iska, Кто хочет сделать - ищет способ, кто не хочет - причину. :biggrin: @Echo Off
cls
Set "BoxIn=Z:\Box_In"
Set "Folds="1111" "2222""
Set "Pref=check"
Set "Mask=%Pref%*.*"
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 "NewName=%~3"
Call Set "NewName=%%NewName:%Pref%=%%"
2>nul Set /A NewName=%NewName%+%Max% ||GoTo :Eof
Set "NewName=%Pref%%NewName:~1%%~1%~4"
>nul Copy %2 "%~5\%NewName%"
>nul Ren %2 "%NewName%"
GoTo :Eof
Как я понимаю, имена папок и файлов в вопросе условны.
Главное, чтобы выдерживалось правило образования имени : ПрефиксНомерРасширение. Расширение может и отсутствовать, тогда:
Set "Mask=%Pref%*."
Предполагаю, что обе подпапки находятся в общей папке. Имена корневой папки, подпапок, выходной папки укажите сами. Кстати, число подпапок в моём решении произвольно, извольте их перечислить.
Укажите префикс в именах файлов, в Вашем вопросе он check
Можно задать формат номера в новом имени.
Для Max=1000 номер будет трёхзначным, например, 001
Для Max=10000 номер будет четырёхзначным, например, 0002
В выходную папку копируются файлы с новым именем.
В исходной папке файлы переименовываются.
Если не надо, чтобы переименовывались файлы в исходной папке, уберите строку с ren
Iska, Кто хочет сделать - ищет способ, кто не хочет - причину. »
megaloman, по условию задачи ничего не сказано про постоянный префикс. Совсем ничего. Просто дан пример возможных имён файлов. Как решите задачу с произвольными именами — я с Вами соглашусь.
Кто хочет сделать - ищет способ, кто не хочет - причину. »
я бы сказал так:
кто хочет передвигаться быстро, садится на транспорт и едет, а кому надо просто добраться и у него времени "вагон", тот может и пешком ходить... :)
кто хочет передвигаться быстро, садится на транспорт и едет, а кому надо просто добраться и у него времени "вагон", тот может и пешком ходить... »
Слушай птичка, летим со мной, там много вкусного! … Лучше день потерять, зато потом за час долететь!
:)
Лучше день потерять, зато потом за час долететь! »
Крыля... ноги... главное - хвост! :up
megaloman
17-08-2018, 22:27
Iska, по условию задачи ничего не сказано про постоянный префикс » Если задача плохо формализована клиентом, приходится телепатить. @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 Естественно, Кусокимени не должен заканчиваться цифрой
Не очень тестировал, подозреваю, этот алгоритм можно обмануть
пытаться выцепить значимую часть имени из произвольно взятых » невозможно любым средством. Сначала придётся определить, что такое значимая часть.
невозможно любым средством. Сначала придётся определить, что такое значимая часть. »
Браво! Теперь Вы меня поняли.
Если задача плохо формализована клиентом, приходится телепатить. »
невозможно любым средством. Сначала придётся определить, что такое значимая часть. »
Вот! И это естественно, т.к. любой алгоритм составить невозможно, если отсутствуют условия для его составления... :)
И да, данную задачу, можно свести к возможному минимуму ошибок, при стелепатированных условиях:
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
1. номера файлов присутствуют в конце имени файла »
Или не присутствуют. Или присутствуют частично.
2. все цифры в конце имен файлов могут являться только счетчиком. »
Или могут не являться счётчиком. И т.д., и т.п.
Потому — утром деньги чётко оговоренное и вменяемое ТЗ, вечером — стулья код. И никак иначе.
Или не присутствуют. Или присутствуют частично. »
Если не присутствуют, присваиваем номер 0, ничего необычного...
На счет частично - это как? Полуцифра? :)
Или могут не являться счётчиком »
могут, вполне, это учтено, но этим кодом:
'_{0:D3}_' -f $n
будут приведены к виду "_XXX_" и если число более трех символов, то обрезано оно не будет...
В общем, поэкспериментируйте с кодом, лучше один раз увидеть, всё же...
утром деньги..., вечером — стулья »
- А можно наоборот?
- Можно... но деньги вперед!
:)
На счет частично - это как? Полуцифра? »
В одном имени — есть, в другом имени — нет. Первым идёт (отдаётся по FindFirstFileEx()) имя без цифр (на NTFS) или какое было первым создано (на FAT'ах). И да — на PowerShell точно так же:
https://i.imgur.com/l14LFKv.png
Начинаем искать постоянную часть имени :).
могут, вполне, это учтено, но этим кодом:
'_{0:D3}_' -f $n
будут приведены к виду "_XXX_" и если число более трех символов, то обрезано оно не будет...
В общем, поэкспериментируйте с кодом, лучше один раз увидеть, всё же... »
Ох… В общем, почитайте тему, что ли. Лучше, действительно, один раз увидеть :):
Хочу создать батник, »PowerShell Вас устроит? »Желательно батник конечно »
Кто бы сомневался, что на PowerShell регулярками:
… -replace '.*\D(\d+)$','$1'
…
… -replace '\d+$') …»
это решается на ать-два.
В одном имени — есть, в другом имени — нет. »
Это понятно. Непонятно это:
присутствуют частично. »
имхо, цифры либо есть, либо их нет... а то какая-то половинчатая беременность получается :)
почитайте тему, что ли »
да читал я, читал... и это:
Желательно батник конечно »
тоже видел... но "желательно" - не значит "только" :)
да и после запуска батника, у меня он "не съел" некоторые тестовые файлы... вот и решил "поучаствовать"...
ну и собственно, батник гибридный сварганить - разве это сложно?
имхо, цифры либо есть, либо их нет... а то какая-то половинчатая беременность получается »
Поменяйте «либо есть, либо нет» на «где-то есть, где-то нет» — вот и будет «частично» :). То есть, я под сим подразумеваю, что есть как имена с цифрами, так и без оных.
ну и собственно, батник гибридный сварганить - разве это сложно? »
Не-не-не. Прямой вызов powershell.exe — это не «гибридный». Гибридный — это, например:
CMD/BAT + JavaScript: два в одном (Страница 1) — CMD/BAT — Коллекция скриптов и идей — Серый форум (http://forum.script-coding.com/viewtopic.php?id=2886)
JScript:CMD - вариант с условной компиляцией (Страница 1) — Windows Script Host, HTA (VBScript, JScript) — Общение — Серый форум (http://forum.script-coding.com/viewtopic.php?id=6304)
CMD/BAT + VBScript: два в одном (Страница 1) — Windows Script Host, HTA (VBScript, JScript) — Общение — Серый форум (http://forum.script-coding.com/viewtopic.php?id=6519)
То есть, я под сим подразумеваю, что есть как имена с цифрами, так и без оных. »
Теперь понятнее, что имелось в виду, но это всё те же два состояния (либо есть, либо нет) и они учтены... я-то думал, что появилось ещё какое-то неопределенное состояние наличия цифр... :)
Не-не-не. Прямой вызов powershell.exe — это не «гибридный». Гибридный — это, например: »
И в чем отличие?
Всё то же самое... по порядку ссылок:
cscript //nologo //e:javascript
CScript /nologo /e:jscript
cscript /nologo /e:vbscript
- и в чем отличие вызова powershell? :)
- и в чем отличие вызова powershell? »
В том, что вызов гибридного должен выглядеть так же. То есть, наподобие:
powershell.exe -File "%~0"
а вот это (http://forum.oszone.net/post-2827021.html#post2827021) совсем не есть:
оно и написано в виде гибрида, т.е. для cmd »
Код не передаётся в командной строке интерпретатора команд PowerShell, а содержится в самом файле, том же файле.
И как я понимаю, поскольку PowerShell исполняет файлы только с определёнными расширениями (так?), фокус провернуть не удастся.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.