Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - [решено] Robocopy и errorlevel

Ответить
Настройки темы
Любой язык - [решено] Robocopy и errorlevel

Новый участник


Сообщения: 7
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 17:54, 07-06-2024

 

Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6577
Благодарности: 1508

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
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
?

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)

Это сообщение посчитали полезным следующие участники:

Отправлено: 20:46, 07-06-2024 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 7
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 22:34, 07-06-2024 | #3


Deadooshka


Сообщения: 2499
Благодарности: 682

Профиль | Отправить PM | Цитировать


поприличней вроде
Код: Выделить весь код
@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
))
Это сообщение посчитали полезным следующие участники:

Отправлено: 04:20, 08-06-2024 | #4


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6577
Благодарности: 1508

Профиль | Отправить PM | Цитировать


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

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)

Это сообщение посчитали полезным следующие участники:

Отправлено: 07:40, 08-06-2024 | #5


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1181
Благодарности: 495

Профиль | Отправить PM | Цитировать


Цитата DJ Mogarych:
написать функцию, но я не знаю, как это делается в CMD. »
в cmd функций нет, там можно городить огород из калов и goto, но функцией это не станет...

-------
scio me nihil scire. Ѫ


Отправлено: 09:01, 08-06-2024 | #6


Новый участник


Сообщения: 7
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата 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. Если где-то не вижу очевидного, то извиняюсь

Отправлено: 10:51, 08-06-2024 | #7


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6577
Благодарности: 1508

Профиль | Отправить PM | Цитировать


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

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)

Это сообщение посчитали полезным следующие участники:

Отправлено: 14:51, 08-06-2024 | #8


Новый участник


Сообщения: 7
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата DJ Mogarych:
»
Благодарю, теперь идеально!

Отправлено: 21:33, 08-06-2024 | #9



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - [решено] Robocopy и errorlevel

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - Множественные условия с получением %ERRORLEVEL% POSTREALITY Скриптовые языки администрирования Windows 2 18-10-2017 22:51
CMD/BAT - [решено] robocopy errorlevel Опиум Скриптовые языки администрирования Windows 21 14-03-2017 20:50
CMD/BAT - [решено] Корректное возвращение Errorlevel hunk3r Скриптовые языки администрирования Windows 13 25-05-2015 18:56
errorlevel msp sov44 Хочу все знать 15 29-07-2013 12:17
Cmd Параметр ERRORLEVEL storm2005 Microsoft Windows NT/2000/2003 1 30-03-2007 18:49




 
Переход