Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Переименование и копирование файлов (http://forum.oszone.net/showthread.php?t=336257)

jordan_74 17-08-2018 11:24 2827006

Переименование и копирование файлов
 
Добрый день! Хочу создать батник, который бы переименовывал файлы в папке и копировал их в итоговую "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

Iska 17-08-2018 12:10 2827039

Цитата:

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

И что Вы хотите получить в этом случае — с трёхзначным-то:
Цитата:

Цитата jordan_74
Нужно чтобы нумерация начиналась с 001 и к имени добавлялся номер папки.
например check001_1, check002_1, check003_1 »

значением номера?!

Цитата:

Цитата jordan_74
Хочу создать батник, »

PowerShell Вас устроит?

jordan_74 17-08-2018 12:45 2827065

Цитата:

Цитата Iska
И что Вы хотите получить в этом случае — с трёхзначным-то: »

Можно ограничиться до тысячи, 999

Цитата:

Цитата Iska
Нужно чтобы нумерация начиналась с 001 и к имени добавлялся номер папки.
например check001_1, check002_1, check003_1 » »

Именно так да


Цитата:

Цитата Iska
PowerShell Вас устроит? »

Желательно батник конечно

Iska 17-08-2018 13:43 2827090

Цитата:

Цитата jordan_74
Желательно батник конечно »

Нет, я тут пас — мало желания на пакетных файлах пытаться выцепить значимую часть имени из произвольно взятых:
Цитата:

Цитата jordan_74
check1,check2,check3 »


jordan_74 17-08-2018 13:56 2827100

Тем не менее благодарю за попытку!!

megaloman 17-08-2018 14:19 2827107

Iska, Кто хочет сделать - ищет способ, кто не хочет - причину. :biggrin:
Вот вариант (скрипт 1)
Код:

@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 17-08-2018 14:24 2827108

Цитата:

Цитата megaloman
Iska, Кто хочет сделать - ищет способ, кто не хочет - причину. »

megaloman, по условию задачи ничего не сказано про постоянный префикс. Совсем ничего. Просто дан пример возможных имён файлов. Как решите задачу с произвольными именами — я с Вами соглашусь.

YuS_2 17-08-2018 14:40 2827115

Цитата:

Цитата megaloman
Кто хочет сделать - ищет способ, кто не хочет - причину. »

я бы сказал так:
кто хочет передвигаться быстро, садится на транспорт и едет, а кому надо просто добраться и у него времени "вагон", тот может и пешком ходить... :)

Iska 17-08-2018 14:45 2827118

Цитата:

Цитата YuS_2
кто хочет передвигаться быстро, садится на транспорт и едет, а кому надо просто добраться и у него времени "вагон", тот может и пешком ходить... »

Неточная цитата
Цитата:

Слушай птичка, летим со мной, там много вкусного! … Лучше день потерять, зато потом за час долететь!
:)

YuS_2 17-08-2018 15:20 2827121

Цитата:

Цитата Iska
Лучше день потерять, зато потом за час долететь! »

Крыля... ноги... главное - хвост! :up

megaloman 17-08-2018 22:27 2827174

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
пытаться выцепить значимую часть имени из произвольно взятых »

невозможно любым средством. Сначала придётся определить, что такое значимая часть.

Iska 18-08-2018 00:46 2827182

Цитата:

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

Браво! Теперь Вы меня поняли.

YuS_2 18-08-2018 09:25 2827214

Цитата:

Цитата 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


Iska 18-08-2018 10:33 2827223

Цитата:

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

Или не присутствуют. Или присутствуют частично.

Цитата:

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

Или могут не являться счётчиком. И т.д., и т.п.

Потому — утром деньги чётко оговоренное и вменяемое ТЗ, вечером — стулья код. И никак иначе.

YuS_2 18-08-2018 12:46 2827251

Цитата:

Цитата Iska
Или не присутствуют. Или присутствуют частично. »

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

Цитата:

Цитата Iska
Или могут не являться счётчиком »

могут, вполне, это учтено, но этим кодом:
Код:

'_{0:D3}_' -f $n
будут приведены к виду "_XXX_" и если число более трех символов, то обрезано оно не будет...

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

Цитата:

Цитата Iska
утром деньги..., вечером — стулья »

- А можно наоборот?
- Можно... но деньги вперед!
:)

Iska 18-08-2018 13:21 2827261

Цитата:

Цитата 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+$') …

»

это решается на ать-два.

YuS_2 18-08-2018 13:39 2827264

Цитата:

Цитата Iska
В одном имени — есть, в другом имени — нет. »

Это понятно. Непонятно это:
Цитата:

Цитата Iska
присутствуют частично. »

имхо, цифры либо есть, либо их нет... а то какая-то половинчатая беременность получается :)

Цитата:

Цитата Iska
почитайте тему, что ли »

да читал я, читал... и это:
Цитата:

Цитата jordan_74
Желательно батник конечно »

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

Iska 18-08-2018 13:50 2827268

Цитата:

Цитата YuS_2
имхо, цифры либо есть, либо их нет... а то какая-то половинчатая беременность получается »

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

Цитата:

Цитата YuS_2
ну и собственно, батник гибридный сварганить - разве это сложно? »

Не-не-не. Прямой вызов powershell.exe — это не «гибридный». Гибридный — это, например:

YuS_2 18-08-2018 13:59 2827270

Цитата:

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

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

Цитата:

Цитата Iska
Не-не-не. Прямой вызов powershell.exe — это не «гибридный». Гибридный — это, например: »

И в чем отличие?
Всё то же самое... по порядку ссылок:
Код:

cscript //nologo //e:javascript
CScript /nologo /e:jscript
cscript /nologo /e:vbscript

- и в чем отличие вызова powershell? :)

Iska 18-08-2018 14:07 2827273

Цитата:

Цитата YuS_2
- и в чем отличие вызова powershell? »

В том, что вызов гибридного должен выглядеть так же. То есть, наподобие:
Код:

powershell.exe -File "%~0"
а вот это совсем не есть:
Цитата:

Цитата YuS_2
оно и написано в виде гибрида, т.е. для cmd »

Код не передаётся в командной строке интерпретатора команд PowerShell, а содержится в самом файле, том же файле.

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

YuS_2 18-08-2018 14:11 2827275

Цитата:

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

Да ладно... можно ведь и так:
Код:

<# ::
@echo off
powershell -ex bypass -c "&{[scriptblock]::create((gc '%~f0' -enc OEM) -join [char]10).invoke()}"
pause&exit /b
#>
$a='Привет мир!'
$b='И вам не кашлять!'
$a
$b

И кстати, в powershell v 6.0 можно и так:
Код:

<# ::
@echo off
pwsh -f "%~f0" %*
pause&exit /b
#>
$a='Привет мир!'
$b='И вам не кашлять!'
$a
$b


Iska 18-08-2018 14:22 2827277

Цитата:

Цитата YuS_2
Да ладно... можно ведь и так: »

Поясните, что с этим кодом делать?

YuS_2 18-08-2018 14:27 2827278

Цитата:

Цитата Iska
Поясните, что с этим кодом делать? »

сохранить в файле, например, с именем run.bat и запустить
кодировка скрипта в первом варианте OEM и UTF8 без BOM во втором случае

PS Ах, да, надо в первом скрипте заменить pwsh на powershell... ну, чтобы встроенный отработал, а не v6.0
поправил скрипты

Iska 18-08-2018 15:15 2827285

Цитата:

Цитата YuS_2
сохранить в файле, например, с именем run.bat и запустить
кодировка скрипта в первом варианте OEM »

Спасибо, ясно. Работает.

Avast тут же отреагировал :). Удалил пакетный файл и попытался удалить powershell.exe.

megaloman 18-08-2018 16:14 2827296

Если без эмоций буквально прочесть поставленную задачу и не напрягать воображение, то:
1. У файлов есть общий префикс, в постановке он check
2. После префикса идёт номер, в постановке он <999
3. Надо получить новое имя:
префикс+номер, дополненный при необходимости нулями до трёх знаков+_+имя папки
То вот еще вариант (скрипт3), тупо и прямолинейно, зато надёжно
Код:

@Echo Off
cls
        Set "BoxIn=Z:\Box_In"
        Set "Folds="1111" "2222""
        Set "Pref=check"
        Set /A Max=1000

        Set "BoxOut=Z:\Box_In\Total"
        If Not Exist "%BoxOut%" Md "%BoxOut%"

        Set /A Max1=%Max%-1
        FOR /L %%n IN (0,1,%Max1%) DO FOR %%d IN (%Folds%) DO (
                FOR %%f IN ("%BoxIn%\%%~d\%Pref%%%n.*") Do (
                        Set /A MMax=%Max%+%%n
                        Call Copy "%%f" "%BoxOut%\%Pref%%%MMax:~1%%_%%~d%%~xf" >nul
                        Call Ren "%%f" "%Pref%%%MMax:~1%%_%%~d%%~xf" >nul
                )
        )
Pause
GoTo :Eof


YuS_2 18-08-2018 16:26 2827302

Цитата:

Цитата Iska
Удалил пакетный файл и попытался удалить powershell.exe. »

И правда что, чего это он там делает? Да и каталог windows, тоже подозрительный набор файлов содержит, надо и его проредить... :)

Iska 18-08-2018 16:50 2827306

Цитата:

Цитата megaloman
Если без эмоций буквально прочесть поставленную задачу и не напрягать воображение, то: …»

Скорее всего, как-нибудь так и есть.

YuS_2, видимо такой гибридный способ пошёл в массы. Вероятно — в массы недописателей-вирусомайнеров.

YuS_2 18-08-2018 17:04 2827310

Цитата:

Цитата Iska
видимо такой гибридный способ пошёл в массы. Вероятно — в массы недописателей-вирусомайнеров. »

Возможно. Вот только, каким бы массовым ни был этот способ, в нем нет ничего вирусного, если не считать таковым вообще запуск скриптов в ОС. К тому же, антивирус должен вирусную активность контролировать (это мое личное мнение), а не быть комбайном, стерегущим каждый вздох, заодно и запуск скриптов, да плюс авторские права и т.д., и т.п., и тут же выписывающим "расстрел на месте". :)

Iska 18-08-2018 18:09 2827315

Кхе-кхе :)… В оное время все, поголовно все значимые антивирусы ругались на банальный CreateObject("ADODB.Stream") … .SaveToFile bla-bla-bla, не особо затрудняя себя проверкой того, что и куда пишется при этом: сказано, что ADODB.Stream .SaveToFile позволяет создавать и записывать двоичные файлы — стало быть, ату его, ату! Причём, обходилось это банальнейшим образом, каким-нибудь CreateObject("ADO" & "DB.Str" & "eam") :lol:.

jordan_74 20-08-2018 07:30 2827473

megaloman,

Спасибо огромное! Но у меня вопрос возник, можешь вот эти 2 строки прокомментировать?

Цитата:

Цитата megaloman
Set "BoxIn=Z:\Box_In"
Set "Folds="1111" "2222"" »

Может я что-то не правильно понимаю, Set "BoxIn=Z:\Box_In - это путь к исходной папке с файлами! ? но у меня две папки с исходными файлами, допустим 1 и 2. И в каждой лежат файлы с префиксом "check"

megaloman 20-08-2018 09:16 2827486

jordan_74, я предполагал, что папка 1 и 2 (уу меня это 1111 и 2222 - имена могут быть произвольными) находятся в корне какой-то общей папки. У меня это Z:\Box_In (у Вас может быть иное, например D: или \\ server\shr и т д) То есть, полные пути у меня Z:\Box_In\1111 и Z:\Box_In\2222.
Меня мучали сомнения в этом. Не проблема переписать скрипт, если папка 1 и 2 - это только имена конечных папок разных путей. Но из постановки это совершенно не следует.

jordan_74 20-08-2018 09:41 2827494

megaloman,

Да, все верно. Есть корневая папка "Rename", в которой и лежат папки "1", "2", и папка куда должны складываться переименованные файлы "total"
тоесть пути выглядят так C:\Onkassa\Rename\1\ , C:\Onkassa\Rename\2\ и C:\Onkassa\Rename\total

jordan_74 20-08-2018 14:55 2827547

megaloman,
Работает! Но обратил внимание, когда допустим в папке "1" имена исходных файлов повторяются, система создаёт копию файла допустим "check6 — копия"
Так вот такой файл батник уже не обрабатывает, хотя по идее должно быть "check007_1". Это можно как то поправить?

megaloman 20-08-2018 15:23 2827551

jordan_74, А что Вам нужно, определитесь!
Цитата:

Цитата jordan_74
когда допустим в папке "1" имена исходных файлов повторяются, система создаёт копию файла допустим "check6 — копия"
Так вот такой файл батник уже не обрабатывает, хотя по идее должно быть "check007 »

Это кривая идея.
У Вас (по идее :) ) есть файлы check6, check6 — копия, check7
И совершенно неправильно по первоначальной постановке сделать из check6 — копия check007
Что тогда придётся делать с исходной check7 ??
Задача решалась в условиях образования имени
ПрефиксНомерРасширение
Ставьте задачу, буду думать
Потом окажется, что есть файлы check6 — копия — копия - и что тогда?
Вам надо сохранять исходную нумерацию или можно перенумеровать все файлы по возрастанию времени создания ?
А как пишется копия (после номера, какие знаки: пробел минус пробел копия?)

YuS_2 20-08-2018 15:36 2827553

Цитата:

Цитата megaloman
Потом окажется, что есть файлы check6 — копия — копия - и что тогда? »

собственно, о чем и была речь в личке... :)

Цитата:

Цитата jordan_74
Это можно как то поправить? »

Можно сделать многое (не всё, конечно, но многое), но для этого необходимо наиболее полное описание условий... и не в процессе создания кода, а изначально. Если есть желание получить полностью рабочее решение, постарайтесь учесть все возможные варианты в условии задачи.

megaloman 20-08-2018 15:53 2827559

jordan_74,
Если элементарно доработать скрипт для смеси файлов
ПрефиксНомерРасширение
ПрефиксНомерСуффиксРасширение
при условии что нет — копия — копия
Код:

@Echo Off
cls
        Set "BoxIn=Z:\Box_In"
        Set "Folds="1111" "2222""
        Set "Pref=check"
        Set "Suff= - копия"
        Set /A Max=1000

        Set "BoxOut=Z:\Box_In\Total"
        If Not Exist "%BoxOut%" Md "%BoxOut%"

        Set /A Max1=%Max%-1
        FOR /L %%n IN (0,1,%Max1%) DO FOR %%d IN (%Folds%) DO (
                FOR %%f IN ("%BoxIn%\%%~d\%Pref%%%n.*") Do (
                        Set /A MMax=%Max%+%%n
                        Call Copy "%%f" "%BoxOut%\%Pref%%%MMax:~1%%_%%~d%%~xf" >nul
                        Call Ren "%%f" "%Pref%%%MMax:~1%%_%%~d%%~xf" >nul
                )
                FOR %%f IN ("%BoxIn%\%%~d\%Pref%%%n%Suff%.*") Do (
                        Set /A MMax=%Max%+%%n
                        Call Copy "%%f" "%BoxOut%\%Pref%%%MMax:~1%%_%%~d%%~xf" >nul
                        Call Ren "%%f" "%Pref%%%MMax:~1%%_%%~d%Suff%%%~xf" >nul
                )
        )
Pause
GoTo :Eof

Суффикс может быть любым, только указывайте в нём все знаки, в том числе и пробелы в начале и конце суффикса. Если в префиксе или суффиксе есть кириллические символы, извольте сохранить скрипт в 866 кодировке.

Iska 20-08-2018 15:53 2827560

Цитата:

Цитата YuS_2
Цитата:

Цитата megaloman
Потом окажется, что есть файлы check6 — копия — копия - и что тогда? »

собственно, о чем и была речь в личке... »

[Iska гладит себя по голове]: умный чукча, умный! :lol::
Цитата:

Цитата Iska
Нет, я тут пас — мало желания на пакетных файлах пытаться выцепить значимую часть имени из произвольно взятых: »


megaloman 20-08-2018 16:01 2827563

Iska, Вы не политкорректны. Надо говорить: умный представитель северного народа, умный!
Иной раз у оленеводов очень трудно добиться полной откровенности - они бывают по детски наивны и непосредственны :) Но если хочется получить удовольствие, надо проявить терпимость.
Цитата:

Цитата сказано не мной, а весьма уважаемыми людьми
Кто хочет сделать - ищет способ, кто не хочет - причину.
Каждое решение плодит новые проблемы. »


Iska 20-08-2018 17:12 2827579

Цитата:

Цитата megaloman
Iska, Вы не политкорректны. Надо говорить: умный представитель северного народа, умный! »

Мне можно, я ж это про себя ;).

megaloman, вот насчёт:
Цитата:

Цитата megaloman
Каждое решение плодит новые проблемы. »

Вы совершенно правы.

Я просто искренне радуюсь, что зараз не ввязался в эту вакханалию ТЗ.


Что же до решения — то я бы, как и множество других вещей с трудно формализуемыми или часто меняющимися ТЗ, делал бы в полуавтоматическом режиме в том же Far Manager'е с плагином Visual renaming:
Перешёл в потребный каталог, выделил потребные файлы

Вызвал плагин

Задал маску для имени
в виде:
Код:

check[C001+1]_2
где:
  • check — постоянная часть имени (вводим ручками или подставляем по Shift-Enter из имени файла и убираем лишнее);
  • [C001+1] — шаблон маски (C — счётчик, 001 — в счётчике будет три символа, начиная с единицы, +1 — приращение счётчика);
  • _2 — постоянная часть имени в виде имени папки, тупо вводим ручками (ну, или можно предварительно просто скопировать имя каталога в буфер обмена и теперь вставить, либо же можно вставить полный путь по Ctrl-[/Ctrl-] и убрать лишнее — кому что нравится).


Нажал Ctrl-Enter (умолчальная кнопка {Переименовать} в диалоге), получил искомый результат



Результат не понравился — переименование всегда можно откатить тем же плагином



Использованная маска доступна в истории поля диалога


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

Всех делов — примерно на полминуты с нуля, и секунд десять — при ранее сохранённой маске.

YuS_2 20-08-2018 18:02 2827587

Цитата:

Цитата Iska
[Iska гладит себя по голове]: умный чукча, умный! »

Да-да, это мы тоже отметили:
Цитата:

Цитата YuS_2
Угу, именно об этом Iska, сразу и написал, с чем я тоже согласен... это всё, опять таки, неполные условия.

:)


Цитата:

Цитата megaloman
Суффикс может быть любым »

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

megaloman 20-08-2018 18:50 2827594

Цитата:

Цитата YuS_2
Лучше дождаться развернутых условий... »

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

jordan_74 21-08-2018 11:07 2827697

megaloman,
Цитата:

Цитата megaloman
Вам надо сохранять исходную нумерацию или можно перенумеровать все файлы по возрастанию времени создания ? »

По возрастанию времени создания не получится я полагаю, всем файлам проставляется одинаковое время - время распаковки архива.

Постараюсь описать подробно:

Файлы чеков я забираю из архива, в котором они пронумерованы условно от check1 до check100. Я кладу архив в папку "1" и распаковываю.
Если в папке распаковать более одного архива, тогда при совпадении имен к имени файлов второго архива добавляется суффикс "_1" например check1_1
Если ещё архив, соответственно будет имя check1_2 и т.д, имя файла корректируется в зависимости от кол-ва архивов. Все это самостоятельно делает 7-Z архиватор.

Поэтому прошу прощения) ввел в заблуждение, суффикса "копия" не будет...

Именно в этом и сложность, как их пронумеровать по порядку..?

jordan_74 21-08-2018 11:59 2827706

Цитата:

Цитата megaloman
Iska,
Цитата когда-то популярная песня:
закрывала уши я, я её не слушала, ой, мама, моя мамочка, как ты была права! »

Откровенно говоря это трындец)), даже просто логику переименования представить не могу, не говоря уже о синтаксисе и написания батника...(

YuS_2 21-08-2018 12:14 2827711

Цитата:

Цитата megaloman
Если долго сидеть на берегу реки, можно дождаться »

Кстати, это немного не о том... смысл сих фраз не надо понимать буквально...
Если сказать их по-русски, то получится: всему свое время, но не упусти момент... т.е. это об умении выжидать наиболее подходящий момент для чего-либо.
И он ещё пока, судя по всему, не наступил... :)


Цитата:

Цитата jordan_74
даже просто логику переименования представить не могу »

если не получается представить логику...
Как уже говорил выше, опишите все возможные варианты входящих данных и то, что из них требуется получить в итоге...
Содержимое файлов имеет отношение к нумерации и вообще нумерация имеет какое-либо значение? Т.е. если просто взять и откинуть все существующие цифры в конце имени файла и перенумеровать их заново - устроит такое решение?
А ещё можно перенумеровать их по дате изменения файла, которая сохраняется даже после извлечения из архива...
В общем, соберитесь с духом и попробуйте таки сформулировать саму задачу (о батниках и синтаксисе голову не ломайте, это только запутает). :)

Iska 21-08-2018 12:28 2827715

Цитата:

Цитата jordan_74
Постараюсь описать подробно: »

Не прошло и полугода пяти страниц темы, как мы добрались таки до того, с чего следовало начинать — до постановки задачи, а не попыток как-нибудь выбить реализацию уже выбранного решения. Браво!


Цитата:

Цитата jordan_74
при совпадении имен к имени файлов второго архива добавляется суффикс "_1" например check1_1
Если ещё архив, соответственно будет имя check1_2 и т.д, имя файла корректируется в зависимости от кол-ва архивов. Все это самостоятельно делает 7-Z архиватор. »

«Зачем Ви тѓ́авите:
Скрытый текст
?!» Не делает он ничего такого «самостоятельно». Пока Вы не нажмёте в диалоге подтверждения кнопку «Переименовать автоматически» — не делает.

jordan_74 21-08-2018 12:53 2827719

YuS_2,
Ну что же, поехали!!!

Есть некое кол-во архивов с файлами, которые в каждом архиве пронумерованы от check1 до условно check100.
Есть папка 1 и 2 , куда архивы и кладутся. Файлов в папка должно быть менее 1000, тоесть 999
Также есть папка Total
Содержимое файлов никакого отношения к нумерации не имеет.

Нужно:
1)Распаковать архив(ы) в папках 1 и 2, после чего файл архива удалить.
2)Переименовать файлы с именами от check001 до check999 при этом добавить к имени значение названия папки 1 или 2 :
А именно от check001_1 до check999_1 и соответственно check001_2 до check999_2
3)Скопировать переименованные файлы в папку "Total"

Цитата:

Цитата YuS_2
А ещё можно перенумеровать их по дате изменения файла, которая сохраняется даже после извлечения из архива... »

Пробовал распаковывать, время для всех файлов ставится одинаковое. Если получится сделать так, то это будет самое верное решение.

Цитата:

Цитата Iska
?!» Не делает он ничего такого «самостоятельно». Пока Вы не нажмёте в диалоге подтверждения кнопку «Переименовать автоматически» — не делает. »

Согласен

megaloman 21-08-2018 13:24 2827728

Цитата:

Цитата Iska
Пока Вы не нажмёте в диалоге подтверждения кнопку «Переименовать автоматически» — не делает »

Если файлы check1 и check1_1 совершенно одинаковые, нефиг их плодить. Другое дело, если check1 - это совпадающие имена разных файлов.
Цитата:

Цитата jordan_74
Откровенно говоря это трындец)), »

Найдите того, кто придумал имена папок 1 и 2 и душите его, душите :).
Допустим, есть исходные файлы check123 и check123_1
Как отличить: check123_1 от переименованного check123 + имя папки _1 ?
Или папки называйте, например, A и B, D1 и D2, 1111 и 2222(лучше не надо), то есть, чтобы от номеров в файле отличались.
Вот решение для задачи, как она поставлена с учетом вышеизложенного:
имеются исходные файлы checkN.ext и checkN_M.ext в папке D.
Скопировать/переименовать их в check00N_D.ext и check00N_M_D.ext
Код:

@Echo Off
cls
        Set "BoxIn=Z:\Box_In"
        Set "Folds="A" "B""
        Set "Pref=check"
        Set /A Suff=10
        Set /A Max=1000

        Set "BoxOut=Z:\Box_In\Total"
        If Not Exist "%BoxOut%" Md "%BoxOut%"

        Set /A Max1=%Max%-1
        FOR /L %%n IN (1,1,%Max1%) DO FOR %%d IN (%Folds%) DO (
                Set /A MMax=%Max%+%%n
                FOR %%f IN ("%BoxIn%\%%~d\%Pref%%%n.*") Do (
rem echo %%f
                        Call Copy "%%f" "%BoxOut%\%Pref%%%MMax:~1%%_%%~d%%~xf" >nul
                        Call Ren "%%f" "%Pref%%%MMax:~1%%_%%~d%%~xf" >nul
                )

                FOR /L %%m IN (1,1,%Suff%) Do FOR %%f IN ("%BoxIn%\%%~d\%Pref%%%n_%%m.*") Do (
rem echo %%f
                        Call Copy "%%f" "%BoxOut%\%Pref%%%MMax:~1%%_%%m_%%~d%%~xf" >nul
                        Call Ren "%%f" "%Pref%%%MMax:~1%%_%%m_%%~d%%~xf" >nul
                )
        )
Pause
GoTo :Eof

Здесь Suff=10 - максимальный рассматриваемый номер версии файла. Можно поставить любой другой. Чем он больше, тем дольше будет выполняться скрипт
Цитата:

Цитата YuS_2
Кстати, это немного не о том... смысл сих фраз не надо понимать буквально...
Если сказать их по-русски, то получится: всему свое время »

Позвольте Вам не позволить! Скорее по русски: Под лежачий камень вода не течет. Или: Вода камень точит. Мне более по нраву тезис: Дорогу осилит идущий. А созерцательное сидение на берегу реки не катит. На реку, огонь и работающего человека можно смотреть бесконечно (и безрезультатно)

YuS_2 21-08-2018 14:04 2827734

Цитата:

Цитата megaloman
Позвольте Вам не позволить! »

Да как Вам будет угодно! :)
Вообще, истина - она одна, а вот правда у каждого своя.
Трактовкой древних мудростей, можно высказать только чисто субъективное мнение, а вот истинное значение, могло быть доступно только сочинителю... но, увы, спросить его о нем, уже невозможно.

jordan_74 21-08-2018 14:23 2827739

Вложений: 1
megaloman,
Это то, что нужно!

jordan_74 21-08-2018 14:33 2827743

megaloman,

И ещё просьба, можно модифицировать, чтобы избежать этих подчеркиваний???
К имени файла вместо _1 , _2 и т.д добавить часть имени архива!? А именно часть номера счета
Наименование архива выглядит следующим образом "Расчетный счет 40702810816540044924.zip"
В имени архива 407028 остается неизменным, а остальная часть меняется в зависимости от номера счета.

Можно к имени добавить оставшуюся часть номера счета ,в данном случае "10816540044924" чтобы в итоге получить например check007_10816540044924_A ???

Iska 21-08-2018 14:44 2827745

jordan_74, Вы опять описываете выбранное Вами решение, а не задачу.
Скрытый текст
Цитата:

Цитата jordan_74
Есть некое кол-во архивов с файлами, которые в каждом архиве пронумерованы от check1 до условно check100. »

1. Некое количество — какое именно? Сколько их может быть? В каких пределах может изменяться? От чего это зависит? Каковы имена архивов?
2. Имена файлов всегда ли check? Нумерация всегда ли с 1? Не может ли быть пропусков в нумерации?
3. Одноимённые файлы в разных архивах одинаковы или нет?

Цитата:

Цитата jordan_74
Есть папка 1 и 2 , куда архивы и кладутся. »

1. Почему папки именуются именно 1 и 2?
2. Почему папки 1 и 2, а архивов — некое количество?
3. Как именно распределяется некое количество архивов по папкам 1 и 2, и почему именно так распределяются, а не как-то иначе?
4. Почему вообще нужно распределять архивы по папкам?

И это вопросы, возникающие только по первым двум (!) предложениям.

Цитата:

Цитата megaloman
А созерцательное сидение на берегу реки не катит. На реку, огонь и работающего человека можно смотреть бесконечно (и безрезультатно) »

Да ну :). Я очень созерцательно тут сидел и результативно наблюдал. И у меня получилось :)!

Цитата:

Цитата jordan_74
megaloman, Это то, что нужно! »

Так там ещё и не check1, а check1.xls/check1.xlsx :lol:.

jordan_74 21-08-2018 15:00 2827751

Цитата:

Цитата Iska
1. Некое количество — какое именно? Сколько их может быть? В каких пределах может изменяться? От чего это зависит? Каковы имена архивов?
2. Имена файлов всегда ли check? Нумерация всегда ли с 1? Не может ли быть пропусков в нумерации?
3. Одноимённые файлы в разных архивах одинаковы или нет? »

1) Архивов может быть не более 20. Зависит от кол-ва используемых для оплаты счетов. Имя архива "Расчетный счет 40702810816540044924 от 17082018" в котором часть номера счета, а именно 407028 остается неизменной. Счетов может быть в пределах десятка
2)Имя файла должно начинаться с check. нумерация должна быть с 001. Пропусков нумерации быть не должно.
3)Одноимённые файлы в разных архивах различны по содержанию. Содержание никак не привязано к нумерации.

Цитата:

Цитата Iska
1. Почему папки именуются именно 1 и 2?
2. Почему папки 1 и 2, а архивов — некое количество?
3. Как именно распределяется некое количество архивов по папкам 1 и 2, и почему именно так распределяются, а не как-то иначе?
4. Почему вообще нужно распределять архивы по папкам? »

Имена папок названы произвольно. Существует 2 источника получения чеков, поэтому то и 2 папки.

все это нужно, чтобы в процессе печати можно было всегда отследить из какого архива был чек, и если он ошибочный, то быстро найти его в исходном архиве. Вобщем вся информация в имени чека нужна для возможности анализа.

megaloman 21-08-2018 18:41 2827782

Цитата:

Цитата jordan_74
Имя архива "Расчетный счет 40702810816540044924 от 17082018"
Счетов может быть в пределах десятка
Одноимённые файлы в разных архивах различны по содержанию
Существует 2 источника получения чеков, поэтому то и 2 папки»

Вперёд на баррикады!
1. В папке A и B чеки разных счетов или счета в этих папках могут совпадать?
2. Вы распаковали архив, допустим, с именем Расчетный счет 40702810816540044924 от 16082018 в папку A. Получили файлы check1,2,3 .... Переименовали их в check001_10816540044924_A, 002, 003, 004 и т д. Скопировали в Total. Что с ними далее?
Следующий шаг: Вы распаковали архив, допустим, с именем Расчетный счет 40702810816540044924 от 17082018 в папку A. Опять получили файлы check1,2,3 .... ??? Что с ними делать, у Вас уже есть файлы check001_10816540044924_A, 002, 003, 004 и т д. Приплыли? Что далее?
3. Зачем вообще эта катавасия? Зачем распаковываются архивы? Не лучше ли файлы после каждой распаковки именовать
10816540044924_20180817_001_A, 002, 003 ...
10816540044924_20180818_001_A, 002, 003 ...
или
20180817_10816540044924_001_A, 002, 003 ...
20180818_10816540044924_001_A, 002, 003 ...
в зависимости от того, что при сортировке предпочтительнее.
А слово check вааще не нужно ...
4. Зачем иметь одинаковые файлы в A, B и Total

Идея такая: батник берёт последовательно архивы, распаковывает в папку (кстати, а где признак того, что архив должен распаковывается в папку A или B?), переименовывает/копирует с именами, связанными с архивом.
Нужно четкое описание, зачем это нужно и последовательность действий.

YuS_2 21-08-2018 21:53 2827819

Цитата:

Цитата jordan_74
2)Имя файла должно начинаться с check. нумерация должна быть с 001. Пропусков нумерации быть не должно. »

Как выше правильно подметили, все равно, однозначной идентификации в общей куче не получается.
1. Что будет сбрасывать счетчик?
а) Поступление новых архивов
б) Переполнение счетчика
в) Наступление определенной даты
2. Как часто поступают архивы? Возможна ли ситуация, что в один день поступает несколько архивов с одинаковым номером счета?
3. Нумерация имеет значение в пределах одного архива или необходима перенумерация всех распакованных файлов под один счетчик?

Iska 21-08-2018 22:24 2827825

Коллеги! Добьём тему до десяти страниц, а ;)? Как думаете?

YuS_2 21-08-2018 22:36 2827826

Цитата:

Цитата Iska
Как думаете? »

что нам стоит дом построить?
нарисуем - будем жить.
:yes:

Busla 22-08-2018 10:36 2827882

Цитата:

Цитата jordan_74
2)Имя файла должно начинаться с check. нумерация должна быть с 001. Пропусков нумерации быть не должно. »

вы всё в одну кучу мешаете

напишите отдельно:
1) что получаете на входе
2) какой результат должен быть

сейчас совершенно непонятно, что вы написали: то ли что входные данные гарантированно не имеют разрывов в нумерации; то ли что имеют и надо перенумеровывать

jordan_74 22-08-2018 11:18 2827892

Цитата:

Цитата megaloman
А слово check вааще не нужно ... »

Программа чекопечати подтягивает файл на печать только в том случае, если его имя начинается на check

Цитата:

Цитата megaloman
Не лучше ли файлы после каждой распаковки именовать
10816540044924_20180817_001_A, 002, 003 ...
10816540044924_20180818_001_A, 002, 003 ...
или
20180817_10816540044924_001_A, 002, 003 ...
20180818_10816540044924_001_A, 002, 003 ... »

Это отличный вариант, но имя файла все равно должно начинаться на check

Цитата:

Цитата megaloman
В папке A и B чеки разных счетов или счета в этих папках могут совпадать? »

A и B это разные источники получения чеков. в этих папках чеки разных счетов и не совпадают.

Цитата:

Цитата megaloman
Скопировали в Total. Что с ними далее? »

Далее я копирую файлы на ресурс печати чеков.

Цитата:

Цитата megaloman
Зачем иметь одинаковые файлы в A, B и Total »

Вы правы, по идее после того, как файлы скопировались в Total, папки А и В нужно очищать

Последовательность действий:

Есть 2 папки А и В и итоговая Total
Ежедневно я кладу в каждую из них архивы с файлами чеков с текущей датой. И печатать я буду только чеки полученные за текущую дату.
Архивы в папках распаковываются, переименовываются файлы c указанием номера счета и даты, условно в check001_10816540044924_20180817_A и т.д
После, файлы чеков из папок А и В копируются в Total, после чего папки A и B очищаются. Папка Total очищается мной вручную, я переношу файлы на ресурс печати
Каждый новый день нумерация файлов начинается с 001

jordan_74 22-08-2018 11:59 2827905

Цитата:

Цитата Busla
напишите отдельно:
1) что получаете на входе
2) какой результат должен быть »

Есть файл check1, check2, check3
на выходе check001_10816540044924_20180817_A

YuS_2 22-08-2018 12:17 2827910

Цитата:

Цитата Busla
сейчас совершенно непонятно »

Не то, чтобы совершенно, а скорее разрозненно и запутанно.
Цитата:

Цитата jordan_74
в каждом архиве пронумерованы от check1 до условно check100. »

Цитата:

Цитата jordan_74
Файлов в папка должно быть менее 1000, тоесть 999 »

Цитата:

Цитата jordan_74
Содержимое файлов никакого отношения к нумерации не имеет. »

отсюда следует:
уникальная нумерация требуется в исходных папках, условно "A" и "B", без учета находящихся там же архивов (хотя местоположение архивов не указано вроде...).
далее:
Цитата:

Цитата jordan_74
Распаковать архив(ы) в папках 1 и 2, после чего файл архива удалить. »

Цитата:

Цитата jordan_74
Переименовать файлы с именами от check001 до check999 при этом добавить к имени значение названия папки »

Цитата:

Цитата jordan_74
Имя архива "Расчетный счет 40702810816540044924 от 17082018" в котором часть номера счета, а именно 407028 остается неизменной. Счетов может быть в пределах десятка »

Цитата:

Цитата jordan_74
К имени файла вместо _1 , _2 и т.д добавить часть имени архива!? А именно часть номера счета »

казалось бы вместо имени папки номер счета, но:
Цитата:

Цитата jordan_74
Можно к имени добавить оставшуюся часть номера счета ,в данном случае "10816540044924" чтобы в итоге получить например check007_10816540044924_A ??? »

ну да ладно - это мелочь...
Цитата:

Цитата jordan_74
Имя файла должно начинаться с check. нумерация должна быть с 001. Пропусков нумерации быть не должно. »

Цитата:

Цитата jordan_74
все это нужно, чтобы в процессе печати можно было всегда отследить из какого архива был чек, и если он ошибочный, то быстро найти его в исходном архиве. Вобщем вся информация в имени чека нужна для возможности анализа. »

исходя из вышеизложенного, остался невыясненными вопросы:
1. Переименование файлов осуществляется на регулярной основе? Если на регулярной, то:
2. Перед запуском переименования, необходимо освобождать исходные и целевую папки от распакованных файлов. Они будут удаляться или перемещаться? Если перемещаться, то куда? Это должен делать разрабатываемый скрипт или какой-либо другой инструмент (возможно вручную?)?
3. С какой частотой поступают архивы с чеками? Они появляются автоматически или вручную? Если автоматически, то возможна ли ситуация появления архива в процессе переименования?

jordan_74 22-08-2018 12:41 2827919

Цитата:

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

По одному разу 5 дней в неделю

Цитата:

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

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

Цитата:

Цитата YuS_2
С какой частотой поступают архивы с чеками? Они появляются автоматически или вручную? Если автоматически, то возможна ли ситуация появления архива в процессе переименования? »

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

YuS_2 22-08-2018 13:04 2827924

Цитата:

Цитата 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) я буду вручную переносить на другой ресурс. »

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

megaloman 22-08-2018 17:25 2827986

Вот решение с включением информации о счетах в именах файлов
Код:

@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.

YuS_2 22-08-2018 17:56 2827988

Цитата:

Цитата megaloman
Set "ArcMask=*.7Z" »

Эмм...
Цитата:

Цитата jordan_74
Наименование архива выглядит следующим образом "Расчетный счет 40702810816540044924.zip" »


megaloman 22-08-2018 19:54 2828007

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

Iska 22-08-2018 20:02 2828008

Цитата:

Цитата megaloman
Но у меня нет зипа, отладить не на чем »

Создайте его при помощи 7-Zip ;).

megaloman 22-08-2018 20:24 2828011

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

Iska 22-08-2018 20:48 2828015

Цитата:

Цитата megaloman
Но загвоздка в том, чтобы распаковать архиватором zip - там будут свои ключи. »

Зачем? Автор темы использует именно 7-Zip для извлечения файлов.

Цитата:

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

Это да.

YuS_2 22-08-2018 21:19 2828017

Цитата:

Цитата megaloman
ом мани падме хум! »

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

Iska 22-08-2018 21:43 2828025

Цитата:

Цитата YuS_2
Цитата:

Цитата megaloman
ом мани падме хум! »

нихт ферштейн, »

И они ещё борятся за почётное звание дома высокой культуры быта! :o

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

mwz 22-08-2018 22:43 2828032

Цитата:

Цитата Iska
И они ещё борятся за почётное звание дома высокой культуры быта! »

Скрытый текст
Ну дык как всегда... Табличка внизу слева. ;)

jordan_74 23-08-2018 09:14 2828079

Вложений: 2
megaloman,
Цитата:

Цитата megaloman

Set "ArcMask=*.7Z" »

В этой строчке поменял 7Z на zip, иначе не срабатывало.

После изменений скрипт отработал именно так как надо!!! (см. результат работы.jpg)

Но при этом я получил сообщение, которое мне непонятно.(см.сообщение.jpg)

megaloman 23-08-2018 10:01 2828087

jordan_74, переименуйте Ваш батник c расширением .TXT и прикрепите к сообщению. Похоже, вместо
GoTo :Eof У вас где-то GoTo :Eo Или GoTo :Eo f
То есть, скопипастили код криво, или случайно извратили.

jordan_74 23-08-2018 10:08 2828091

Вложений: 1
megaloman,

Файл прикрепил
http://forum.oszone.net/attachment.p...1&d=1535008085

megaloman 23-08-2018 10:16 2828093

jordan_74, предчувствия меня не обманули, самый последний GoTo :Eof у вас GoTo :Eo
А отрабатывает нормально, так как без этой строки в принципе можно и обойтись. Я обычно ей обозначаю конец подпрограммы, и, если вы далее ничего не наваяете своего, она не обязательна
Цитата:

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

jordan_74 23-08-2018 11:10 2828112

Цитата:

Цитата megaloman
можно сделать фэншуйнее, если счетов не много, то указать в батнике, какие счета принадлежат источнику A, а какие B, и, в дальнейшем, не напрягая усталость и мыслительные ресурсы, складывать все пришедшие архивы в одну папку. »

Я уточню у бухгалтеров. Но уже сейчас все работает именно так как надо! Спасибо огромнейшее!! Мегаааааа!! :yahoo:

Blakx87 07-10-2018 08:51 2834805

Доброе утро. Прошу помощи при создании кода.
Необходимо файл 1.txt из папки с:\1\ скопировать в папку c:\2\ но с другим именем. Можно дату и время в место имени. Ее раззапускаю батник, он снова копирует, но с другим уже именем.
Заранее благодарю

Iska 07-10-2018 11:53 2834825

Код:

@echo off
setlocal enableextensions enabledelayedexpansion

set sSourceFile=c:\1\1.txt
set sDestFolder=c:\2

if exist "%sSourceFile%" (
        if exist "%sDestFolder%\." (
                for /f "usebackq delims=" %%i in (
                        `2^>nul wmic.exe OS get LocalDateTime /value ^| find.exe /i "LocalDateTime"`
                ) do for /f "delims=+-" %%j in ("%%i") do set s%%j
                set sLocalDateTime=!sLocalDateTime:.=!
                set sNewFileName=!sLocalDateTime:~0,-3!.txt
                >nul copy /y "%sSourceFile%" "%sDestFolder%\!sNewFileName!"
        ) else (
                echo Can't find destination folder [%sDestFolder%].
                exit /b 2
        )
) else (
        echo Can't find source file [%sSourceFile%].
        exit /b 1
)

endlocal
exit /b 0


megaloman 07-10-2018 15:19 2834851

Iska, Пытаюсь понять смысл задачи. Один и тот же неизменный файл копировать много раз с разными именами - нонсенс. Другое дело, копировать исходный файл с включением в имя времени последнего изменения - смысл усматриваю.
Код:

@Echo Off
        Call :@Files "C:\1\1.txt" "C:\2"
GoTo :Eof

:@Files
        If Not Exist %1 (Echo %1 -file not found &Exit /B 2)
        If Not Exist %2 (Echo %2 -folder not found &Exit /B 2)
        Set "Fin=%~1"
        For /f "tokens=1* delims=," %%a in ('wmic datafile where "name='%Fin:\=\\%'" get 'Last Modified' /format:csv') Do (
                If /I "%%a"=="%ComputerName%" Set "Df=%%b"
        )
        If Exist "%~2\%~n1_%Df:~0,14%%~x1" (Echo file already exists "%~2\%~n1_%Df:~0,14%%~x1" &Exit /B 0)
        Set Command=Copy %1 "%~2\%~n1_%Df:~0,14%%~x1"
        %Command% >nul
        Set "Err=%ErrorLevel%"
        If Not %Err%==0 (Echo Command not successful &Echo %Command% &Exit /B %Err%)
Exit /B 0

После копирования получим файл ИсходноеИмя_ГГГГММДДччммсс.Расширение
Где ГГГГММДДччммсс -время последнего изменения файла

alpap 07-10-2018 15:36 2834856

Первый раз скопируется с тем же именем в нужную папку (будет создана при отсутствии)
При последующих копированиях к имени будет добавляться дата и время
(если из под dir убрать \%f%, условие будет распространяться на все файлы в папке и подпапках 1, соблюдая структуру при этом)
Код:

@echo off
set "d1=C:\1"
set "d2=C:\2"
set "f=1.txt"

set "stime=%time:~,8%"
for /f "delims=" %%a in ('dir /a-d/b/s "%d1%\%f%"') do set "d=%%a"& call :l "%%a" "%%d:%d1%=%d2%%%"
pause& exit
 
:l
 2>nul md "%~dp2"
 if not exist "%~2" (>nul copy "%~1" "%~2") else (>nul copy "%~1" "%~dp2%~n1_%date%_%stime::=.%%~x1")
exit /b


Gizmon 14-02-2024 11:48 3024146

Парни, а можно ли сделать батник с такими функциями?
Есть на компе папка название CSSv34 в ней есть папка bin с файлами.
Нужно что бы батник помещенный в эту папку при запуске удалял папку bin полностью + переименовывал папку в которой лежит добавляя в конец существующего названия актуальную дату по типу CSSv34_140224 - где CSSv34 старое название папки _140224 это дата день месяц год
А после всех действий батник должен запустить exe файл с игрой который так же лежит в этой папке, например css.exe


Время: 18:47.

Время: 18:47.
© OSzone.net 2001-