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

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

tr011_tmn 06-03-2009 09:47 1056281

отказ доступа при использовании команды Move
 
Добрый день коллеги, у меня к вам такой вопрос.
Столкнулся с проблемой:
Код:

set dir1=Folder
set TP1=c:\temp
set TP2=c:\temp\folder2
md %dir1%
md %TP1%
md %TP2%

на выходе получаю папку Folder в папке откуда запущен скрипт и папку folder2 в папке c:\temp
при использовании команды :
Код:

MOVE /Y %TP2% %dir1%
получаю отказано в доступе
Структура папки folder2:
Код:

folder2
-folder3
--folder5
-folder4
-files1
-files2

если же использовать:
Код:

set dir1=Folder
set TP2=folder2
md %dir1%
md %TP2%

команда:
Код:

MOVE /Y %TP2% %dir1%
срабатывает на ура.
Код:

COPY /Y %TP2% %dir1%
Копирует только содержимое папки folder2 без подкаталогов находящихся в ней, что не есть гуд

Petya V4sechkin 06-03-2009 11:43 1056359

Цитата:

Цитата tr011_tmn
получаю отказано в доступе

Оно работает, если батник на том же диске (C).
Команда Move в таком синтаксисе переименовывает папку, а переименование возможно только в пределах логического диска.

Можно использовать команду XCopy:
Код:

xcopy /Y /E /H %TP2% %dir1%
(хотя она копирует содержимое папки folder2, а не саму папку).

tr011_tmn 06-03-2009 12:20 1056392

Цитата:

Цитата Petya V4sechkin
(хотя она копирует содержимое папки folder2, а не саму папку). »

а нет ли возможности перенсти всю папку.
P.S. как один из выходов можно конечно в папке приемнике создать аналогичную папку, и копировать тогда уже в нее.
Код:


set dir1=Folder
set dir2=Folder\folder2
set TP1=c:\temp
set TP2=c:\temp\folder2
md %dir1%
md %dir2%
md %TP1%
md %TP2%
xcopy /Y /E /H %TP2% %dir2%

Но это неудобно конечно

Petya V4sechkin 06-03-2009 12:22 1056395

Цитата:

Цитата tr011_tmn
Но это неудобно конечно

Почему?

tr011_tmn 06-03-2009 12:41 1056412

Цитата:

Цитата Petya V4sechkin
Почему? »

заведомо добавляеться шанс допустить ошибку в коментировании переменных, избыточными на мой взгляд данными

kero 14-04-2013 20:03 2132499

Подскажите, пожалуйста, надо переместить (move /y ) папку в другую папку которая уже содержит папку с именем перемещаемой папки, получаю отказано в доступе, как сделать чтоб папка назначения переписывалась?

Georgio 16-04-2013 21:51 2134038

Цитата:

Цитата kero
Подскажите, пожалуйста, надо переместить (move /y ) папку в другую папку которая уже содержит папку с именем перемещаемой папки, получаю отказано в доступе, как сделать чтоб папка назначения переписывалась? »

Код:

IF EXIST Folder1\Folder2 (MOVE /Y Folder2\*.* Folder1\Folder2&&RD Folder2) ELSE MOVE /Y Folder2 Folder1

kero 17-04-2013 02:33 2134166

Georgio,
Folder1 это источник, Folder2 это назначение, так ?
Если так то не получается.

Georgio 17-04-2013 10:33 2134301

Цитата:

Цитата kero
Folder1 это источник, Folder2 это назначение, так ?
Если так то не получается. »

Folder1 - папка, в которую перемещают, Folder2 - папка, которую перемещают. И всё получается.

kero 17-04-2013 19:01 2134614

Georgio,
в таком случаи опять получаю отказано в доступе :dont-know
Если удалить вручную ту папку которая должна переписыватся то всё получается.

А что move не может переписывать папки?

Georgio 18-04-2013 01:24 2134821

Цитата:

Цитата kero
опять получаю отказано в доступе »

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

Цитата:

Цитата kero
А что move не может переписывать папки? »

Команда MOVE ориентирована, в основном, на работу с файлами и не может осуществлять слияние папок и, тем более, перезапись атрибутов.
Она не может даже перемещать папки по конструкции *.* (или просто *). Конструкция *.* в случае MOVE относится только к файлам, если вместе с файлами находятся ещё и папки, то они не будут затронуты перемещением, и команда RD в моём примере не сработает ("Папка не пуста.").
Но команда MOVE может переименовывать (!) и файлы, и папки при перемещении (в отличие от команды COPY, которая не работает с папками и может переименовывать только файлы при копировании).

kero, в Вашем случае лучше использовать команду XCOPY.
Код:

XCOPY /E /H /I /Y Imya_Kopiruemoy_Papki Imya_Papki_V_Kotoruyu_Kopiruyut\Imya_Kopiruemoy_Papki
RD /S /Q Imya_Kopiruemoy_Papki

или
Код:

XCOPY /E /H /I /Y Imya_Kopiruemoy_Papki Imya_Papki_V_Kotoruyu_Kopiruyut\Novoe_Imya_Kopiruemoy_Papki
RD /S /Q Imya_Kopiruemoy_Papki

Команда XCOPY с данными параметрами создаст папку назначения, если её не существует, скопирует подпапки любого уровня вложенности, включая пустые, скрытые и системные, и все файлы, включая скрытые и системные, а команда RD с данными параметрами полностью удалит копируемую папку со всем содержимым, что будет равносильно перемещению (если не брать во внимание даты создания и т. п.).

А для полного совершенствования копирования нужно использовать команду ROBOCOPY. Утилита Robocopy.exe входит в комплектацию ОС Windows, начиная с Windows Vista.

Iska 18-04-2013 02:45 2134835

Цитата:

Цитата Georgio
Утилита Robocopy.exe входит в комплектацию ОС Windows, начиная с Windows Vista. »

А до того — в комплекты соответствующих Resource Kit'ов.

kero 18-04-2013 16:35 2135170

Georgio, спс за ответы.

Цитата:

Цитата Georgio
Отказ в доступе может быть в случае когда у папки "проблемы" с безопасностью »

нет это исключается специально для теста создал папки.

А напишите какой нибудь пример ROBOCOPY с перемещением папки "АА1" и перезаписью ею существующей папки "ВВ1" (все они конечно с файлами) одной строкой.

Georgio 19-04-2013 08:12 2135587

Цитата:

Цитата kero
А напишите какой нибудь пример ROBOCOPY с перемещением папки "АА1" и перезаписью ею существующей папки "ВВ1" (все они конечно с файлами) одной строкой. »






Примеры простого использования утилиты Robocopy.




Пример 1.



Код:

ROBOCOPY AA1 BB1 /Z /TIMFIX /DCOPY:T /MIR /SL /XJ /R:4 /W:15

Параметры:

/Z - копирование с возобновлением (старый файл будет заменятся новым, если у него другое содержимое и другая дата изменения)

/TIMFIX - исправление атрибутов времени для файлов (в дополнение к /Z переписывается и дата создания для одинаковых файлов)

/DCOPY:T - копирование меток времени для папок (дата создания, дата изменения)

/MIR - зеркальное копирование (копируются все вложенные папки, включая пустые, и удаляются все файлы и папки назначения, которых не существует в источнике)

/SL - копирование самих символических ссылок вместо копирования целевого объекта этих ссылок (на всякий случай, если таковые попадутся, чтобы не скопировать лишние гигабайты)

/XJ - исключение из копирования точек соединения (также на всякиЙ случай - от них потом сложно избавлятся)

/R:n - число повторных попыток для неудавшихся копий (по умолчанию - 1 миллион)

/W:n - время ожидания между повторными попытками (по умолчанию - 30 секунд)


Значения для параметров /R и /W (/R:4 /W:15) - мои личные, можно менять, но в пределах разумного. Объясняю. Если не выставлять эти параметры совсем, то по умолчанию 30 секунд x 1 000 000 = 30 000 000 секунд; натыкается процесс копирования на "файл, занятый другим процессом" и висит, пытаясь безрезультатно его скопировать в течении почти года (30 000 000 секунд = 347 суток!). С другой стороны, если выставить /R:0 /W:0, то если случится какой-нибудь системный или аппаратный сбой, он может вызвать ошибку копирования; например, захотел прилечь на диване вместе с ноутбуком, стал переносить его со стола, - отвалился внешний жёсткий диск, с которого или на который копируется. Большинство программ в таких случаях прекращают работу или виснут, а Robocopy с парамерами ожидания и повтора подождёт, пока вставится и запустится диск, и продолжит работу, исправив ошибку (минуты обычно хватает - 15 секунд x 4).




Пример 2.



Код:

ROBOCOPY AA1 BB1 /ZB /TIMFIX /DCOPY:T /MIR /SL /XJ /R:4 /W:15

Отличается от предыдущего одной буквой - параметр /ZB вместо /Z, но отличие существенное. С параметром /ZB также идёт копирование с возобновлением, но если доступ запрещен, используется режим архивации. Например, завёлся в папке System Volume Information вирус (в Windows XP это часто), антивирус его видит, а вытащить не может, - атрибуты безопасноти папки не позволяют, оценить угрозу надо, а "взламывать" папку (добавлять, менять разрешения доступа) в случае ложной угрозы как то не с руки. Используя команду с данными параметрами (можно, конечно, без /SL /XJ) делаем копию этой папки, но без атрибутов безопасности, и вирус можно отправлять на VirusTotal.




Пример 3.



Команда с такими параметрами не будет удалять файлы и папки, которых нет в источнике, а только добавлять новые и переписывать изменившиеся, то есть будет выполнять функцию коллектора.


Код:

ROBOCOPY AA1 BB1 /E /ZB /DCOPY:T /TIMFIX /SL /XJ /R:4 /W:15



Пример 4.



С добавлением параметра /MOV к остальным параметрам файлы будут перемещаться (копироваться и удаляться из источника), а папки оставаться на месте; если же добавить параметр /MOVE, то файлы будут перемещаться вместе с папками.


Код:

ROBOCOPY AA1 BB1 /ZB /DCOPY:T /TIMFIX /MIR /SL /XJ /MOV /R:4 /W:15

ROBOCOPY AA1 BB1 /ZB /DCOPY:T /TIMFIX /MIR /SL /XJ /MOVE /R:4 /W:15




Пример 5.



А с этими параметрами на выходе будет полная зеркальная копия (репликация) со всеми атрибутами, включая атрибуты безопасности (разрешения, владелец, аудит), но "файлы, занятые другим процессом" будут скопированы с нулевой длиной, то есть окажутся пустыми.


Код:

ROBOCOPY AA1 BB1 /ZB /COPYALL /DCOPY:T /SECFIX /TIMFIX /MIR /SL /R:4 /W:15



***

Если описал десять процентов от возможностей утилиты Robocopy, то хорошо. А она может всё (или почти всё). Может копировать только выбранные атрибуты, не копируя сам файл, может исключать заданные файлы и папки (в т. ч. по маске) из копирования, может вести журнал...
Думаю, что понятно, что вместо папок "AA1" и "BB1" надо вписывать их полные имена (в случае пробелов - в кавычках), если, конечно, BAT-файл не находится в одной директории с обеими папками. Параметры можно расставлять в любом порядке вслед за папками.

mariolast 07-08-2017 22:32 2757009

Похожая тема, как мне надо.
Суть вопроса в том,чтобы выполнить именно перемещение содержимого одной папки в другую. Подобно Ctrl-X Ctrl-V с подтверждением замены, в этом случае содержимое переносится мгновенно практически.
Использование ROBOCOPY делает простое копирование а не перемещение и это занимает минут 10 в моей задаче, что есть слишком долго.
Move может перемещать так как надо только файлы, с каталогами проблема, если есть совпадающие, получаем Отказано в доступе.
Может есть доступное решение?

megaloman 08-08-2017 14:07 2757124

mariolast,
Код:

@Echo Off

Set "BoxIn=Z:\Soft_In
Set "DirIn=JS_Host"
Set "BoxOut=Z:\Soft_Arc"

xcopy /T /E /I /Y "%BoxIn%\%DirIn%" "%BoxOut%\%DirIn%"

FOR /F "usebackq delims=" %%i IN (`xcopy /E /Y /I /L /F "%BoxIn%\%DirIn%\*.*" "%BoxOut%\%DirIn%"`) DO Call :AllMove "%%i"
For /F "usebackq delims=" %%i In (`Dir "%BoxIn%\%DirIn%\*.*" /B /S /A:D 2^>nul^|Sort /R`) Do RD "%%i" 2>nul
RD "%BoxIn%\%DirIn%" 2>nul

GoTo :Eof

:AllMove
        Set Twin=%1
        Set Twin=%Twin: -> =" "%
        Move /Y %Twin% >nul 2>&1
GoTo :Eof


mariolast 08-08-2017 19:07 2757219

Похожим методом пробовал через ROBOCOPY, но это идет простое копирование, что по времени сильно удлиняет процесс, в то время как перемещение делает это практически мгновенно

Shulzzz 22-07-2021 17:32 2962652

mariolast, Тоже периодически сталкиваюсь с необходимостью быстро перенести папку с тяжелыми файлами из одного места в другое с заменой. Не получилось у Вас найти доступное решение?

megaloman 22-07-2021 18:36 2962664

Shulzzz, Вы пробовали моё решение? Я его порядком забыл, но там нет копирования файлов, есть копирование структуры и перенос файлов. Однако, если перенос делается на разные диски (разделы диска) - это по любому будет долго. Мигом - в рамках одного диска. Проверил - работает! За 4 года решение не прокисло!

Shulzzz 23-07-2021 00:36 2962678

megaloman, Нет, не пробовал, обязательно попробую, перенос осуществляется в рамках одного и того же раздела, интересует именно скорость, сохранение структуры папок и файлов в них, и условие, что в целевой папке файлы с одинаковыми названиями должны именно заменяться(обновляться), а не прежде удаляться и на их место записываться новые, т.е. если в переносимой папке нет определенного файла, то в целевой папке старый такой файл должен оставаться на месте


Время: 07:06.

Время: 07:06.
© OSzone.net 2001-