PDA

Показать полную графическую версию : [решено] 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
Собственно, так и сделал, временно но не уверен был, что реализация "правильная". Осталось как-нибудь добавить вывод описание ошибок:)
Благодарю!

Sham
08-06-2024, 04:20
поприличней вроде
@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).

YuS_2
08-06-2024, 09:01
написать функцию, но я не знаю, как это делается в 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