Показать полную графическую версию : [решено] Перемещение Папки с файлами
Здравствуйте уважаемые!
помогите пожалуйста, нужен батник для перемещение папки с файлами
например: нужно переместить папку C:\UTM\transporter\transportDB D:\Server\Fasa2\UTM\transporter
Вариант (если папка назначения уже существует и в ней есть файлы с теми же именами, что перемещаются сюда — то будет появляться запрос на замену таких файлов; для замены без подтверждения, как и для замены файлов с атрибутом "только для чтения", потребуются дополнительные ключи для команды 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.
mwz спасибо, все сработало, вложенные папки и файлы скопированы а старая папка удалена!
Patroklos
18-02-2019, 21:28
А зачем nul после if not exist "%destdir%\nul"?
Какая у него функция?
А зачем nul после »
Это я ещё с давних времён такую конструкцию использую: определить, существует ли папка.
Поскольку в каждой существующей папке можно обратится к псевдофайлу nul, то если папка существует — то и файл этот будет найден, а если папки такой нет — то и псевдофайл найден не будет.
Сейчас определение существования конкретной папки делается проще — но приведённая конструкция универсальна и работает хоть в Windows 3.1, хоть в Windows 10.
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 (или а) папка тоже не будет создана, но ошибки не будет выведено, естественно.
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
для проверки наличия папки достаточно проверить наличие только A\, а файла — наличие A при отсутствии A\ »
так работает
Самым правильным будет проверка существования как целевого каталога, так и одноимённого с ним файла, потому для каталога используем имя «"%destdir%\."», для файла — чистый «"%destdir%», потому как а) кроме каталога %destdir% там может существовать и файл %destdir%, б) точка — реально существующее в каталоге файловой системы имя каталога, ссылающееся на сам этот каталог, равно как «..» — ссылка на родительский каталог. «.» существует в любом каталоге, в том числе и в корневом, «..» — существует в любом каталоге, кроме корневого.
Update: собственно, коллеги выше уже всё разжевали. Когда-нибудь я научусь сначала дочитывать тему до конца, и только потом «кидаться в бой» :lol:.
точка — реально существующее »
Вот оно! Фактически идеальная и универсальная запись. :)
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.