Войти

Показать полную графическую версию : [решено] Утилита robocopy


vitaliy_filonov@vk
25-09-2020, 10:39
Доброго времени суток, господа. Подскажите, мне нужно копировать все содержимое из папки А в папку Б. Копировать открытые файлы или системные и продолжать копирование при ошибке и так далее. Наткнулся на утилиту robocopy. Хотел создать батник и запихнуть его в службы, но вот незадача, при запуске батника пишет вот такую штуку :

C:\Users\Виталий\Desktop\Работа\Копирование паба>robocopy "C:\Users\╨Т╨╕╤В╨░╨╗╨╕╨╣\Desktop\╨а╨░╨▒╨╛╤В╨░\╨Ъ╨╛╨┐╨╕╤А╨╛╨▓╨░╨╜╨╕╨╡ ╨┐╨░╨▒╨░\╨в╨╡╤Б╤В ╨╛╤В ╤Б╤О╨┤╨░" "C:\Users\╨Т╨╕╤В╨░╨╗╨╕╨╣\Desktop\╨а╨░╨▒╨╛╤В╨░\╨Ъ╨╛╨┐╨╕╤А╨╛╨▓╨░╨╜╨╕╨╡ ╨┐╨░╨▒╨░\╨в╨╡╤Б╤В ╤Б╤О╨┤╨░" /MIR /Z

-------------------------------------------------------------------------------
ROBOCOPY :: Robust File Copy for Windows
-------------------------------------------------------------------------------

Начало: 25 сентября 2020 г. 12:37:36
Источник : C:\Users\╨Т╨╕╤В╨░╨╗╨╕╨╣\Desktop\╨а╨░╨▒╨╛╤В╨░\╨Ъ╨╛╨┐╨╕╤А╨╛╨▓╨░╨╜╨╕╨╡ ╨┐╨░╨▒╨░\╨в╨╡╤Б╤В ╨╛╤В ╤Б╤О╨┤╨░\
Назначение : C:\Users\╨Т╨╕╤В╨░╨╗╨╕╨╣\Desktop\╨а╨░╨▒╨╛╤В╨░\╨Ъ╨╛╨┐╨╕╤А╨╛╨▓╨░╨╜╨╕╨╡ ╨┐╨░╨▒╨░\╨в╨╡╤Б╤В ╤Б╤О╨┤╨░\

Файлы: *.*

Параметры: *.* /S /E /DCOPY:DA /COPY:DAT /PURGE /MIR /Z /R:1000000 /W:30

------------------------------------------------------------------------------

2020/09/25 12:37:36 ОШИБКА 3 (0x00000003) Доступ к исходной папке C:\Users\╨Т╨╕╤В╨░╨╗╨╕╨╣\Desktop\╨а╨░╨▒╨╛╤В╨░\╨Ъ╨╛╨┐╨╕╤А╨╛╨▓╨░╨╜╨╕╨╡ ╨┐╨░╨▒╨░\╨в╨╡╤Б╤В ╨╛╤В ╤Б╤О╨┤╨░\
Системе не удается найти указанный путь.

Вывод, не может найти указанный путь. НО! Если я вставляю тот же код батника просто в CMD, там все прекрасно работает и копируется).

Вот исходный код батника:
robocopy "C:\Users\Виталий\Desktop\Работа\Копирование паба\Тест от сюда" "C:\Users\Виталий\Desktop\Работа\Копирование паба\Тест сюда" /MIR /Z

Подскажите, где ошибаюсь и почему из батника не работает, а если код вставить в командную строку, все работает.

vitaliy_filonov@vk
25-09-2020, 11:13
Проверил сейчас, так абсолютно с любым батником

Fors1k
25-09-2020, 11:49
нужно копировать все содержимое из папки А в папку Б »
powershell
param(
$pathIN = "C:\Users\Виталий\Desktop\Работа\Копирование паба\Тест от сюда",
$pathOUT = "C:\Users\Виталий\Desktop\Работа\Копирование паба\Тест сюда"
)cls

copy -Recurse "$pathIN\*" $pathOUT

megaloman
25-09-2020, 12:25
vitaliy_filonov@vk, переименуйте батник в txt-файл и приложите к сообщению. По видимому, проблема в Вашем текстовом редакторе. По умолчанию, cmd файлы необходимо создавать в 866 кодировке, а у Вас нечто другое - дайте посмотреть файл. Кстати, для такой простой задачи прекрасно подходит команда xcopy. Для примера приложил 2 файла с Вашими путями и в 866 кодировке для Robocopy и Xcopy.

vitaliy_filonov@vk
25-09-2020, 12:45
Вот. Насчет кодировки в текстовом редакторе не подумал), сейчас попробую

vitaliy_filonov@vk
25-09-2020, 12:58
Все заработало). Нужно было задать кодировку в батнике первой строкой:
chcp 1251

Еще вопрос по этой теме, в текстовом файле, который скинул, я удаляю файлы в папке командой del. Как обойти проблему с удалением открытых файлов? Пытался Унлокером даже удалять через CMD, он тоже не справляется. Или это нереально?

megaloman
25-09-2020, 13:12
vitaliy_filonov@vk, Да у Вас вообще в Вашем файле UTF8. По умолчанию, сохраняйте батник в 866 кодировке, если пИшите пути с кириллицей в 1251 кодировке - тогда в начале вставьте Chcp 1251. C UTF8 не получится, ИМХО.

Fors1k
25-09-2020, 13:17
Как обойти проблему с удалением открытых файлов? »
Нужно удалить все, кроме открытых файлов, или надо принудительно освободить их и удалить всё?

vitaliy_filonov@vk
25-09-2020, 13:27
Да, принудительно освободить и удалить. Копируются открытые файлы хорошо, а вот удаляться не хотят

greg zakharov
25-09-2020, 14:03
Засада в том, что если каким-то процессом (пусть даже не критичным) удерживается дескриптор некоторого файла, закрытие дескриптора не столько приведёт систему в нестабильное состояние, сколько может сказаться негативно на самом процессе; второе, что следует учесть - разрешения и политики доступа к файлу; есть масса других нюансов с принудительным удалением. Безопасней послать процессу, удерживающему файл, запрос на освобождение или запланировать pending move, то есть отложенное удаление файла (при перезагрузке).
Fors1k, по умолчанию pwsh не "копирует" acl.

Fors1k
25-09-2020, 16:30
Fors1k, по умолчанию pwsh не "копирует" acl. »
Точно.

param(
$pathIN = "C:\Users\Виталий\Desktop\Работа\Копирование паба\Тест от сюда",
$pathOUT = "C:\Users\Виталий\Desktop\Работа\Копирование паба\Тест сюда"
)cls

(gci $pathIN -Recurse).FullName|%{
Get-Acl -li $_|Set-Acl -li (copy -pas -li $_ $_.Replace($pathIN,$pathOUT))
}
принудительно освободить и удалить »
greg zakharov прав, тут нужно быть осторожным, и понимать причину блокировки файла.
Если вы уверены, что "так надо", то можно будет сделать принудительное удаление.




© OSzone.net 2001-2012