PDA

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


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

mwz
17-02-2019, 13:54
Вариант (если папка назначения уже существует и в ней есть файлы с теми же именами, что перемещаются сюда — то будет появляться запрос на замену таких файлов; для замены без подтверждения, как и для замены файлов с атрибутом "только для чтения", потребуются дополнительные ключи для команды 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
mwz спасибо, все сработало, вложенные папки и файлы скопированы а старая папка удалена!

Patroklos
18-02-2019, 21:28
А зачем nul после if not exist "%destdir%\nul"?
Какая у него функция?

mwz
18-02-2019, 21:52
А зачем nul после »

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

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

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

alpap
18-02-2019, 23:04
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
alpap, хм... Спасибо!

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

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

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

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

megaloman
19-02-2019, 00:53
mwz, alpap, 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
для проверки наличия папки достаточно проверить наличие только A\, а файла — наличие A при отсутствии A\ »
так работает

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

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

mwz
19-02-2019, 13:22
точка — реально существующее »
Вот оно! Фактически идеальная и универсальная запись. :)




© OSzone.net 2001-2012