Показать полную графическую версию : [решено] Переименование и копирование файлов
jordan_74
22-08-2018, 12:41
Переименование файлов осуществляется на регулярной основе? »
По одному разу 5 дней в неделю
2. Перед запуском переименования, необходимо освобождать исходные и целевую папки от распакованных файлов »
да, все папки до переименования должны очищаться скриптом. После переименования должны очищаться исходные папки также скриптом. После переименования файлы из целевой папки (Total) я буду вручную переносить на другой ресурс.
С какой частотой поступают архивы с чеками? Они появляются автоматически или вручную? Если автоматически, то возможна ли ситуация появления архива в процессе переименования? »
Архивы один раз в день сразу пачкой. Я скачиваю их из электронной почты. По поводу автоматом или вручную не могу сказать, надо ковыряться настройки OutLook, там должна быть возможность из нескольких писем сохранить вложение.
Новый архив в процессе переименования не появится
Ежедневно я кладу в каждую из них архивы с файлами чеков с текущей датой. И печатать я буду только чеки полученные за текущую дату.
Архивы в папках распаковываются, переименовываются файлы 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. Файлы, распакованные из архивов, после переименования перемещаются в целевой каталог.
да, все папки до переименования должны очищаться скриптом. После переименования должны очищаться исходные папки также скриптом. После переименования файлы из целевой папки (Total) я буду вручную переносить на другой ресурс. »
Скрипт не чистит перед переименованием, но переносит переименованные файлы в целевую папку. Архивы скрипт удаляет.
Ну, а т.к. целевая папка чистится только вручную, то будем считать, что исходные каталоги чистые и в них ничего нет. Туда необходимо только добавить архивы и запустить скрипт.
megaloman
22-08-2018, 17:25
@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.
Set "ArcMask=*.7Z" »
Эмм...
Наименование архива выглядит следующим образом "Расчетный счет 40702810816540044924.zip" »
megaloman
22-08-2018, 19:54
YuS_2, ом мани падме хум! Не увидел зип. Но это не принципиально. Легко изменяется. Но у меня нет зипа, отладить не на чем
Но у меня нет зипа, отладить не на чем »
Создайте его при помощи 7-Zip ;).
megaloman
22-08-2018, 20:24
Iska, да создать зип можно,. Но загвоздка в том, чтобы распаковать архиватором zip - там будут свои ключи. Я с 7z убодался. Насколько всё-таки rar удобнее.
Но загвоздка в том, чтобы распаковать архиватором zip - там будут свои ключи. »
Зачем? Автор темы использует именно 7-Zip для извлечения файлов.
Насколько всё-таки rar удобнее. »
Это да.
ом мани падме хум! »
нихт ферштейн, я ничего такого не имел в виду! :)
ом мани падме хум! »
нихт ферштейн, »
И они ещё борятся за почётное звание дома высокой культуры быта! :o
Токмо классическая латынь, токмо хардкор: «Mea culpa, mea culpa».
И они ещё борятся за почётное звание дома высокой культуры быта! »
Ну дык как всегда... Табличка внизу слева (http://mwz-ru.homeserver.com/travels/DSC03419.JPG). ;)
jordan_74
23-08-2018, 09:14
megaloman,
Set "ArcMask=*.7Z" »
В этой строчке поменял 7Z на zip, иначе не срабатывало.
После изменений скрипт отработал именно так как надо!!! (см. результат работы.jpg)
Но при этом я получил сообщение, которое мне непонятно.(см.сообщение.jpg)
megaloman
23-08-2018, 10:01
jordan_74, переименуйте Ваш батник c расширением .TXT и прикрепите к сообщению. Похоже, вместо
GoTo :Eof У вас где-то GoTo :Eo Или GoTo :Eo f
То есть, скопипастили код криво, или случайно извратили.
jordan_74
23-08-2018, 10:08
megaloman,
Файл прикрепил
http://forum.oszone.net/attachment.php?attachmentid=153867&stc=1&d=1535008085
megaloman
23-08-2018, 10:16
jordan_74, предчувствия меня не обманули, самый последний GoTo :Eof у вас GoTo :Eo
А отрабатывает нормально, так как без этой строки в принципе можно и обойтись. Я обычно ей обозначаю конец подпрограммы, и, если вы далее ничего не наваяете своего, она не обязательна
A и B это разные источники получения чеков. в этих папках чеки разных счетов и не совпадают можно сделать фэншуйнее, если счетов не много, то указать в батнике, какие счета принадлежат источнику A, а какие B, и, в дальнейшем, не напрягая усталость и мыслительные ресурсы, складывать все пришедшие архивы в одну папку.
jordan_74
23-08-2018, 11:10
можно сделать фэншуйнее, если счетов не много, то указать в батнике, какие счета принадлежат источнику A, а какие B, и, в дальнейшем, не напрягая усталость и мыслительные ресурсы, складывать все пришедшие архивы в одну папку. »
Я уточню у бухгалтеров. Но уже сейчас все работает именно так как надо! Спасибо огромнейшее!! Мегаааааа!! :yahoo:
Доброе утро. Прошу помощи при создании кода.
Необходимо файл 1.txt из папки с:\1\ скопировать в папку c:\2\ но с другим именем. Можно дату и время в место имени. Ее раззапускаю батник, он снова копирует, но с другим уже именем.
Заранее благодарю
@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
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После копирования получим файл ИсходноеИмя_ГГГГММДДччммсс.Расширение
Где ГГГГММДДччммсс -время последнего изменения файла
Первый раз скопируется с тем же именем в нужную папку (будет создана при отсутствии)
При последующих копированиях к имени будет добавляться дата и время
(если из под 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
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.