Показать полную графическую версию : [решено] Копирование одной папки\файла в разные папки с контролем заполняемости
михаилНезнайка
13-09-2020, 18:35
Здравствуйте. Задача такая: Есть папка\файл которую нужно скопировать в архивную папку, но архивных папок 2-е, и они на разных дисках. Я могу сделать такую копию, но папка будет копироваться сразу в 2-е папки, а мне нужно, что бы папка копировалась с начало в одну папку, а при заполнении её копировалось во второю, при этом работал скрипт по контролю количества папок, и старые удалялись.
Пример того что у меня получилось:
setlocal enableextensions enabledelayedexpansion
set sFolder=P:\копии
set eFolder=P:\"новая папка1"
set /a iCount = 2
for %%d in (P:\копии\%time:~0,2%.%time:~3,2%,O:\копии\%time:~0,2%.%time:~3,2%) do echo d | xcopy /E /H /R /K /Y /D /C /Q %eFolder% %%d
for /f "skip=%iCount% usebackq delims=" %%i in (`dir /b /a:d /o:-d /t:w "%sFolder%"`) do rd /s /q "%sFolder%\%%~i"
for /f "skip=%iCount% usebackq delims=" %%i in (`dir /b /a:d /o:-d /t:w "O:\копии"`) do rd /s /q "O:\копии\%%~i"
endlocal
exit /b 0
При этом они копируются сразу в 2-е папки, и контроль заполнения тоже одновременно в 2-х папках, т.е. он не берёт с начало первую паку, копирует в неё 2-е папки, потом во вторую ещё 2-е папки, а потом опять в 1-ю.
Можно сделать и на основе robocopy.
megaloman
14-09-2020, 09:23
михаилНезнайка, В архивные папки копируются папки? Их имена разные или Вы переименовываете их при копировании? По какому принципу создаются их имена?
Сначала Вы делаете копии в первую папку. Она заполнилась (?), копируем во вторую, и она заполнилась. Что дальше? В первую папку -по какому принципу она очищается?
И вообще, в чем смысл такого копирования? Почему бы не копировать папки попеременно в первый и второй архив, тогда на обоих дисках будем иметь сравнительно свежие копии, а не так, как Вы предлагаете: на одном диске свежие, на другом заведомое старье
михаилНезнайка
14-09-2020, 13:44
"В архивные папки копируются папки?" Да копируются папки.
"Их имена разные или Вы переименовываете их при копировании?" Можно предопределить сразу их имена, но в моём случае они создаются при копировании
"По какому принципу создаются их имена?" Это не имеет значения, можно задать имена сразу, либо как у меня, называются при копировании "время их создания"
"Сначала Вы делаете копии в первую папку. Она заполнилась (?), копируем во вторую, и она заполнилась. Что дальше? В первую папку -по какому принципу она очищается?" Дальше по логике моего скрипта, он удаляет самую струю копию (или в первой папке или во второй) и закидывает туда копию сделанную сегодня.
"И вообще, в чем смысл такого копирования?" Смысл в том, что есть два логических диска по 400Гб, и нужно копировать архив в эти папки. Но мне не нужно создавать копии сразу в двух папках, а сначала копировалось в одну, потом при заполнении во вторую, потом при заполнении опять в первую. Это для того, что бы не объединять эти два логических диска в один диск в 800Гб.
DJ Mogarych
14-09-2020, 14:34
Принцип примерно такой:
Powershell:
$sourceFolder = "E:\ISO\2019"
$sourceSize = (dir "$sourceFolder" -Recurse -File |measure -sum Length).sum
$volume1Space = (get-volume -DriveLetter F).sizeremaining
$volume2Space = (get-volume -DriveLetter G).sizeremaining
if ($volume1Space -gt $sourcesSize) { "Копия в первую папку" }
elseif ($volume2Space -gt $sourcesSize) { "Копия во вторую папку" }
else { "Места нигде нет, примите меры!" }
megaloman
14-09-2020, 18:00
@Echo Off
cls
Set "BoxIn=Z:\Box_In"
Set "Arc1=Z:\Box_Arc\Arc1"
Set /A NArc1=3
Set "Arc2=Z:\Box_Arc\Arc2"
Set /A NArc2=3
Call :Count "%Arc1%" "iArc1" "tArc1" "oArc1"
Call :Count "%Arc2%" "iArc2" "tArc2" "oArc2"
Set "Arc=%Arc1%"
Set "oArc=%oArc1%"
Set /A iArc=%iArc1%
Set /A NArc=%NArc1%
If %iArc1% GEQ %NArc1% If %iArc2% LSS %NArc2% Set /A tArc2=0
If %tArc2% LSS %tArc1% (
Set "Arc=%Arc2%"
Set "oArc=%oArc2%"
Set /A iArc=%iArc2%
Set /A NArc=%NArc2%
)
If %iArc% GEQ %NArc% Rd /Q /S "%oArc%"
FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "TDate=%%d"
For %%i In ("%BoxIn%") Do XCopy /E /H /R /K /Y /D /C /Q "%BoxIn%" "%Arc%\%TDate:~0,14%_%%~nxi\"
pause
Exit /B
:Count
SetLocal
rem Set "Val=CreationDate"
Set "Val=LastModified"
2>nul MD %1
Set /A N=0, DT=900000000 &Set "Old= "
FOR /F "usebackq delims=" %%d IN (`2^>nul Dir %1 /B /A:D /O:-D /T:C`) DO (
Call Set /A N+=1
Set "Old=%~1\%%d"
)
If "%N%"=="0" EndLocal &(Set /A %~2=0, %~3=900000000 &Set "%~4=" &Exit /B 0)
FOR /F "tokens=1,2 delims== " %%i IN ('"WMIC FSDIR WHERE name="%Old:\=\\%" get %Val% /format:Textvaluelist"') DO If /I "%%i"=="%Val%" Set "DT=%%j"
Set /A DT=%DT:~2,9%
EndLocal &(Set /A %~2=%N%, %~3=%DT% &Set "%~4=%Old%")
Exit /B
михаилНезнайка
21-09-2020, 12:23
Спасибо. Всё сработало.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.