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

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

sawVip 17-02-2019 12:52 2858402

Перемещение Папки с файлами
 
Здравствуйте уважаемые!
помогите пожалуйста, нужен батник для перемещение папки с файлами
например: нужно переместить папку C:\UTM\transporter\transportDB D:\Server\Fasa2\UTM\transporter

mwz 17-02-2019 13:54 2858414

Вариант (если папка назначения уже существует и в ней есть файлы с теми же именами, что перемещаются сюда — то будет появляться запрос на замену таких файлов; для замены без подтверждения, как и для замены файлов с атрибутом "только для чтения", потребуются дополнительные ключи для команды xcopy):
Код:

setlocal
set sourcedir=C:\UTM\transporter\transportDB
set destdir=D:\Server\Fasa2\UTM\transporter
if not exist "%destdir%\nul" md "%destdir%"
xcopy "%sourcedir%" "%destdir%\" /E /H /K
REM RD /S /Q "%sourcedir%"

Комментарий REM в последней строке, где должна удаляться исходная папка, поставлен временно: только для отладки; когда будет убеждение, что батник работает нормально — удалить слово REM и пробел после него.

Ну и для подавления вывода на экран можно добавить первой строкой: @echo off.

sawVip 17-02-2019 19:30 2858455

mwz спасибо, все сработало, вложенные папки и файлы скопированы а старая папка удалена!

Patroklos 18-02-2019 21:28 2858660

А зачем nul после
Код:

if not exist "%destdir%\nul"
?
Какая у него функция?

mwz 18-02-2019 21:52 2858664

Цитата:

Цитата Patroklos
А зачем nul после »

Это я ещё с давних времён такую конструкцию использую: определить, существует ли папка.

Поскольку в каждой существующей папке можно обратится к псевдофайлу nul, то если папка существует — то и файл этот будет найден, а если папки такой нет — то и псевдофайл найден не будет.

Сейчас определение существования конкретной папки делается проще — но приведённая конструкция универсальна и работает хоть в Windows 3.1, хоть в Windows 10.

alpap 18-02-2019 23:04 2858675

mwz,
можете пояснить как это работает, когда возможно что "A\nul" существует?
Код:

@echo off
if exist "A\nul" (echo "A\nul") else (echo Not "A\nul")
echo:
if exist "A" (echo "A") else (echo Not "A")
pause>nul

Файл 156554
Файл 156555
одновременно с одним именем папку и файл без расширения в одной директории не разместить.
безо всякого вреда создать папку без вопросов (если есть) проще так: 2>nul md A, но опять же при наличии файла без расширения с именем A (или а) папка тоже не будет создана, но ошибки не будет выведено, естественно.

mwz 19-02-2019 00:42 2858685

alpap, хм... Спасибо!

Насчёт файла и папки с одинаковым именем понял, учту (мог и не учесть в других случаях; здесь же при использовании \nul предполагалось, что проверено будет наличие именно папки).

И придётся менять свои воззрения: значит nul теперь не во всех конструкциях может быть использован (благо в данном случае к проблемам не привело)...

А файл и папка, скажем, A, тогда при проверке должны разделяться проверкой существования A\ и A , причём для проверки наличия папки достаточно проверить наличие только A\, а файла — наличие A при отсутствии A\

Я вроде правильно понял?

megaloman 19-02-2019 00:53 2858687

mwz, alpap,
Цитата:

Цитата mwz
if not exist "%destdir%\nul" md "%destdir%" »

Эта конструкция не рабочая. Без nul работает
Вот тестовый батник
Код:

@Echo Off
cls
        Set "destdir=Z:\kuku1"
        2>nul Rd /S /Q %destdir%
        If Not Exist "%destdir%\nul" (md "%destdir%" &Echo kuku11)
        If Not Exist "%destdir%\nul" (md "%destdir%" &Echo kuku12)
Echo -------------------------------------------------
        Set "destdir=Z:\kuku2"
        2>nul Rd /S /Q %destdir%
        If Not Exist "%destdir%" (md "%destdir%" &Echo kuku21)
        If Not Exist "%destdir%" (md "%destdir%" &Echo kuku22)
pause
GoTo :Eof

Вот результат

Код:

kuku11
Подпапка или файл Z:\kuku1 уже существует.
kuku12
-------------------------------------------------
kuku21

mwz, А удалять папку RD /S /Q "%sourcedir%" это крайне опрометчиво: допустим, xcopy не все файлы скопировал (например, места не хватило или путь недоступный указан).
Надо поберечься. Вот вариант решения. Непустые папки удалены не будут
Код:

@Echo Off
        Set "FoldIn=C:\UTM\transporter\transportDB"
        Set "FoldOut=D:\Server\Fasa2\UTM\transporter"
       
        Call :FileMove "%FoldIn%" "%FoldOut%"
        For /F "usebackq delims=" %%i In (`2^>nul Dir "%FoldIn%" /B /S /A:D ^|Sort /R`) Do 2>nul Rd "%%i"
        2>nul Rd "%FoldIn%"
GoTo :Eof

:FileMove
        If Not Exist "%~2\%~nx1" Md "%~2\%~nx1"
        FOR /F "usebackq delims=" %%f IN (`2^>nul Xcopy /H /E /R /D /F %1 "%~2\%~nx1\"`) DO (
                Set "SS=%%f"
                Call :Xdel "%%SS: -> =" "%%"
        )
Exit /B

:XDel
        If Exist %2 Del %1
GoTo :Eof


alpap 19-02-2019 01:51 2858690

Цитата:

Цитата mwz
для проверки наличия папки достаточно проверить наличие только A\, а файла — наличие A при отсутствии A\ »

так работает

Iska 19-02-2019 04:54 2858703

Самым правильным будет проверка существования как целевого каталога, так и одноимённого с ним файла, потому для каталога используем имя «"%destdir%\."», для файла — чистый «"%destdir%», потому как а) кроме каталога %destdir% там может существовать и файл %destdir%, б) точка — реально существующее в каталоге файловой системы имя каталога, ссылающееся на сам этот каталог, равно как «..» — ссылка на родительский каталог. «.» существует в любом каталоге, в том числе и в корневом, «..» — существует в любом каталоге, кроме корневого.

Update: собственно, коллеги выше уже всё разжевали. Когда-нибудь я научусь сначала дочитывать тему до конца, и только потом «кидаться в бой» :lol:.

mwz 19-02-2019 13:22 2858766

Цитата:

Цитата Iska
точка — реально существующее »

Вот оно! Фактически идеальная и универсальная запись. :)


Время: 10:35.

Время: 10:35.
© OSzone.net 2001-