Показать полную графическую версию : [решено] Robocopy и errorlevel
diablo.att
07-06-2024, 17:54
Добрый день.
Нужно, чтобы при запуске скрипта, папки зеркально из разных директорий, копировались в другие директории, а при обнаружении ошибок cmd вставали на паузу и, в идеале, выводили описание ошибки.
Вот сам скрипт:
set source1=C:\Users\nameuser\AppData\...
set target1=D:\Backup\AppData\...
set source2=C:\Users\nameuser\...
set target2=D:\Backup\...
set source3=D:\Backup...
set target3=E:\Backup...
set source4=D:\...
set target4=E:\...
set source5=D:\test...
set target5=E:\test...
robocopy "%source1%" "%target1%" /NFL /COPY:DAT /DCOPY:T /R:10 /W:10 /MIR
robocopy "%source2%" "%target2%" /NFL /COPY:DAT /DCOPY:T /R:10 /W:10 /MIR
robocopy "%source3%" "%target3%" /NFL /COPY:DAT /DCOPY:T /R:10 /W:10 /MIR
robocopy "%source4%" "%target4%" /NFL /COPY:DAT /DCOPY:T /R:10 /W:10 /MIR
robocopy "%source5%" "%target5%" /NFL /COPY:DAT /DCOPY:T /R:10 /W:10 /MIR
if [%errorlevel%] GTR [1] pause
Errorlevel срабатывает только на последнюю строчку robocopy.
А еще я не понял, как сделать, чтобы errorlevel выводил сообщения:(. Но это не в приоритете
Собственно, как сделать так, чтобы error level работал на все строчки, или, если знаете реализацию лучше, без использования cmd/robocopy - буду рада услышать.
DJ Mogarych
07-06-2024, 20:46
robocopy "%source1%" "%target1%" /NFL /COPY:DAT /DCOPY:T /R:10 /W:10 /MIR
if [%errorlevel%] GTR [1] pause
robocopy "%source2%" "%target2%" /NFL /COPY:DAT /DCOPY:T /R:10 /W:10 /MIR
if [%errorlevel%] GTR [1] pause
robocopy "%source3%" "%target3%" /NFL /COPY:DAT /DCOPY:T /R:10 /W:10 /MIR
if [%errorlevel%] GTR [1] pause
robocopy "%source4%" "%target4%" /NFL /COPY:DAT /DCOPY:T /R:10 /W:10 /MIR
if [%errorlevel%] GTR [1] pause
robocopy "%source5%" "%target5%" /NFL /COPY:DAT /DCOPY:T /R:10 /W:10 /MIR
if [%errorlevel%] GTR [1] pause
?
diablo.att
07-06-2024, 22:34
Собственно, так и сделал, временно но не уверен был, что реализация "правильная". Осталось как-нибудь добавить вывод описание ошибок:)
Благодарю!
поприличней вроде
@echo off
set data1=C:\Users\nameuser\AppData\...;D:\Backup\AppData\...
set data2=C:\Users\nameuser\...;D:\Backup\...
set data3=D:\Backup...;E:\Backup...
set data4=D:\...;E:\...
set data5=D:\test...;E:\test...
for /l %%N in (1,1,5) do ( for /f "tokens=1,2 delims=;" %%A in ('call echo %%data%%N%%') do (
robocopy "%%A" "%%B" /NFL /COPY:DAT /DCOPY:T /R:10 /W:10 /MIR
if not errorlevel 0 pause
))
DJ Mogarych
08-06-2024, 07:40
Ещё лучше написать функцию, но я не знаю, как это делается в CMD.
Вот вариант для Powershell версии 3 и новее:
function Copy-Robocopy ($from,$to) {
$logFile = "$PSScriptRoot\$(Get-Date -f "yyyyMMdd-hhmmss")_$($from -replace '[^\d\w]').txt"
robocopy $from $to /NFL /COPY:DAT /DCOPY:T /R:10 /W:10 /MIR /LOG:$logFile
if ($LASTEXITCODE -ge 8) {Write-Host -fore Red "Ошибка при копировании, см. лог:`n$logFile"; pause}
}
Copy-Robocopy -from "C:\Users\nameuser\AppData\..." -to "D:\Backup\AppData\..."
Copy-Robocopy -from "C:\Users\nameuser\..." -to "D:\Backup\..."
Copy-Robocopy -from "D:\Backup..." -to "E:\Backup..."
Copy-Robocopy -from "D:\..." -to "E:\..."
Copy-Robocopy -from "D:\test..." -to "E:\test..."
Пишутся логи, при ошибке выводится сообщение и путь к логу, который надо посмотреть.
Лог пишется в ту же папку, где лежит <файл скрипта>.ps1
Кстати, успешное копирование в Робокопи - это коды возврата с 1 по 7 включительно (https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/robocopy#exit-return-codes).
написать функцию, но я не знаю, как это делается в CMD. »
в cmd функций нет, там можно городить огород из калов и goto, но функцией это не станет...
diablo.att
08-06-2024, 10:51
поприличней вроде
Если в будущем нужно добавить/убрать каталог, нужно изменить то, что выделил красным?
@echo off
...
set data5=D:\test...;E:\test...
set data6=D:\1;E:\1
for /l %%N in (1,1,6) do ( for /f "tokens=1,2 delims=;" %%A in ('call echo %%data%%N%%') do (
robocopy "%%A" "%%B" /NFL /COPY:DAT /DCOPY:T /R:10 /W:10 /MIR
if not errorlevel 0 pause
))
Вот вариант для Powershell
Хмм, а нельзя, чтобы лог записывался в один файл?
И в обоих вариантах, если в каталоге-назначения есть лишние папки/файлы, которых нет в исходном каталоге errorlevel не должны выдавать ошибку(код 2) и вставать на паузу?
Собственно, в моем варианте, скрипт удаляет лишний каталог/файл и выдает-->...
...
robocopy "%source5%" "%target5%" /NFL /COPY:DAT /DCOPY:T /R:10 /W:10 /MIR
if [%errorlevel%] GTR [1] pause
...
...
C:\Windows\System32>if [2] GTR [1] pause
Для продолжения нажмите любую клавишу . . .
PS. Если где-то не вижу очевидного, то извиняюсь ;)
DJ Mogarych
08-06-2024, 14:51
чтобы лог записывался в один файл »
$t = get-date -f "yyyyMMdd-HHmmss"
function Copy-Robocopy ($from,$to) {
$logFile = "$PSScriptRoot\${t}_robocopy_log.txt"
robocopy $from $to /NFL /COPY:DAT /DCOPY:T /R:10 /W:10 /MIR /LOG+:$logFile
if ($LASTEXITCODE -ge 8) {Write-Host -fore Red "Ошибка при копировании $from, см. лог:`n$logFile"; pause}
}
diablo.att
08-06-2024, 21:33
»
Благодарю, теперь идеально!
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.