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

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

diablo.att 07-06-2024 17:54 3027985

Robocopy и errorlevel
 
Добрый день.
Нужно, чтобы при запуске скрипта, папки зеркально из разных директорий, копировались в другие директории, а при обнаружении ошибок 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 3027987

Код:

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 3027988

Собственно, так и сделал, временно но не уверен был, что реализация "правильная". Осталось как-нибудь добавить вывод описание ошибок:)
Благодарю!

Sham 08-06-2024 04:20 3027989

поприличней вроде
Код:

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

Ещё лучше написать функцию, но я не знаю, как это делается в 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 включительно.

YuS_2 08-06-2024 09:01 3027992

Цитата:

Цитата DJ Mogarych
написать функцию, но я не знаю, как это делается в CMD. »

в cmd функций нет, там можно городить огород из калов и goto, но функцией это не станет...

diablo.att 08-06-2024 10:51 3027993

Цитата:

Цитата Sham Sham
поприличней вроде

Если в будущем нужно добавить/убрать каталог, нужно изменить то, что выделил красным?

Код:

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

Цитата:

Цитата DJ Mogarych DJ
Вот вариант для 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 3028000

Цитата:

Цитата diablo.att
чтобы лог записывался в один файл »

Код:

$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 3028008

Цитата:

Цитата DJ Mogarych

Благодарю, теперь идеально!


Время: 03:04.

Время: 03:04.
© OSzone.net 2001-