Любой язык - [решено] Robocopy и errorlevel

Ответить
Аватара пользователя
diablo.att

Любой язык - [решено] Robocopy и errorlevel

Сообщение diablo.att »

Добрый день.

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

Re: Любой язык - [решено] Robocopy и errorlevel

Сообщение DJ Mogarych »

Код:

Код: Выделить всё

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

Re: Любой язык - [решено] Robocopy и errorlevel

Сообщение diablo.att »

Собственно, так и сделал, временно но не уверен был, что реализация "правильная". Осталось как-нибудь добавить вывод описание ошибокИзображение

Благодарю!
Аватара пользователя
diablo.att

Re: Любой язык - [решено] Robocopy и errorlevel

Сообщение diablo.att »

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



Код:

Код: Выделить всё

@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

Re: Любой язык - [решено] Robocopy и errorlevel

Сообщение DJ Mogarych »

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

Re: Любой язык - [решено] Robocopy и errorlevel

Сообщение YuS_2 »

Цитата DJ Mogarych:



написать функцию, но я не знаю, как это делается в CMD.
Любой язык - [решено] Robocopy и errorlevel




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

Re: Любой язык - [решено] Robocopy и errorlevel

Сообщение diablo.att »

Цитата 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

Re: Любой язык - [решено] Robocopy и errorlevel

Сообщение DJ Mogarych »

Цитата diablo.att:



чтобы лог записывался в один файл
Любой язык - [решено] Robocopy и errorlevel






Код:

Код: Выделить всё

$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}
}
Ответить

Вернуться в «Скриптовые языки администрирования Windows»