Показать полную графическую версию : [решено] bat. Копирование папок из текущей директории
Browning Zed
21-11-2018, 20:32
Здравствуйте.
Как написать батник который копировал бы папки относительно текущей директории, т.е. папки где лежит сам bat-файл? Необходимо:
1. Скопировать из "текущая директория\ folder 111" в "уровень выше текущей директории"
3. Скопировать из "текущая директория\ folder 222" в "C:\Users\User_Name\Documents"
В первом случае надо скопировать папку «folder 111», расположенную директорией ниже в папку директорией выше. Во втором примере папку «folder 222», расположенную директорией ниже в системную папку "Документы".
1. Скопировать из "текущая директория\ folder 111" в "уровень выше текущей директории" »
@echo off
setlocal enableextensions enabledelayedexpansion
set "sSourceFolder=folder 111"
2>nul md "..\%sSourceFolder%"
xcopy.exe /e /i ".\%sSourceFolder%" "..\%sSourceFolder%\"
endlocal
exit /b 0
3. Скопировать из "текущая директория\ folder 222" в "C:\Users\User_Name\Documents" »
@echo off
setlocal enableextensions enabledelayedexpansion
set "sSourceFolder=folder 222"
2>nul md "C:\Users\User_Name\Documents\%sSourceFolder%"
xcopy.exe /e /i ".\%sSourceFolder%" "C:\Users\User_Name\Documents\%sSourceFolder%\"
endlocal
exit /b 0
Если под User_Name подразумевается текущий пользователь, то:
@echo off
setlocal enableextensions enabledelayedexpansion
set "sSourceFolder=folder 222"
2>nul md "%UserProfile%\Documents\%sSourceFolder%"
xcopy.exe /e /i ".\%sSourceFolder%" "%UserProfile%\Documents\%sSourceFolder%\"
endlocal
exit /b 0
Browning Zed
21-11-2018, 23:05
Если под User_Name подразумевается текущий пользователь, то:
Да, все верно, текущий пользователь. Последний код отлично работает, спасибо. :up
Но с первым кодом, где копируем на уровень выше не получилось. Дело в том, что батник запускается через exe-файл лежащий в другом месте, и папка копируется на уровень выше той папки где находится экзешник, а не там где лежит bat. И еще непонятен момент с более глубокими по вложенности уровнями папок, например таким образом:
Скопировать из "текущая директория\folder 1\ folder 2\ folder 3" в "уровень выше текущей директории"
батник запускается через exe-файл лежащий в другом месте, и папка копируется на уровень выше той папки где находится экзешник, а не там где лежит bat. »
Разумеется, так и должно быть. Если исполняемый файл запускается напрямую из Проводника — его текущим каталогом будет место его расположения. Если этот исполняемый файл запускает пакетный файл без изменения своего текущего каталога и без каких-то дополнительных условий — текущим каталогом для пакетного файла также будет место расположения исполняемого файла. И именно там пакетный файл будет ожидать найти каталог «folder 111». Как и заказывалось.
Меня терзают смутные сомнения, что Вы путаете понятия «текущий каталог» и «каталог, в котором расположен пакетный файл».
И еще непонятен момент с более глубокими по вложенности уровнями папок, например таким образом:
Скопировать из "текущая директория\folder 1\ folder 2\ folder 3" в "уровень выше текущей директории" »
Не вижу никаких проблем:
@echo off
setlocal enableextensions enabledelayedexpansion
set "sSourceFolder=folder 3"
2>nul md "..\%sSourceFolder%"
xcopy.exe /e /i ".\folder 1\folder 2\%sSourceFolder%" "..\%sSourceFolder%\"
endlocal
exit /b 0
Browning Zed
22-11-2018, 18:21
Меня терзают смутные сомнения, что Вы путаете понятия «текущий каталог» и «каталог, в котором расположен пакетный файл »
Да, так и есть, извиняюсь - тут я перепутал.
Спасибо за помощь, с путями копирования вроде разобрался. Но остался один нерешенный вопрос. Копирую через батник папку с файлами в системную папку «Документы». Добавил в код батника ключ: /y, чтобы файлы перезаписывались, но файлам находящимся в папке «Документы» присвоен атрибут «Только чтение», что в итоге влечет запись в командной строке: "Отказано в доступе". Файлы, соответственно, не перезаписываются и ключ: /r не помогает. Как можно выйти из данной ситуации?
но файлам находящимся в папке «Документы» присвоен атрибут «Только чтение» »
Зачем это было сделано? Очень странно.
Покажите.
Browning Zed
22-11-2018, 19:00
Зачем это было сделано? Очень странно.
Покажите. »
Это файлы конфигурации игры (ini файлы), если им не присвоить атрибут «только чтение», игра будет сбрасывать графические настройки на дефолтные.
@echo off
setlocal enableextensions enabledelayedexpansion
set "GetFolder1=folder 3"
2>nul md "%UserProfile%\Documents\%GetFolder1%"
xcopy.exe /e /i /y /r /k ".\Extras\GameSettings\%GetFolder1%" "%UserProfile%\Documents\%GetFolder1%\"
endlocal
exit /b 0
В теории, ключ /r должен перезаписать файл только для чтения, а ключ /k, должен сохранить атрибут «только чтение» у нового файла (который перезаписывает старый). Но этого не происходит.
Это файлы конфигурации игры (ini файлы), »
Ясно. И всё же — покажите. Посредством attrib.exe.
P.S. Вы знаете имена всех этих файлов?
Browning Zed
22-11-2018, 19:33
Ясно. И всё же — покажите. Посредством attrib.exe.
P.S. Вы знаете имена всех этих файлов? »
Если я Вас правильно понял, нужно это?
A C:\Users\Nikolay\Documents\BioWare\Mass Effect\Config\BIOCredits.ini
A C:\Users\Nikolay\Documents\BioWare\Mass Effect\Config\BIOEditor.ini
A R C:\Users\Nikolay\Documents\BioWare\Mass Effect\Config\BIOEngine.ini
A R C:\Users\Nikolay\Documents\BioWare\Mass Effect\Config\BIOGame.ini
A R C:\Users\Nikolay\Documents\BioWare\Mass Effect\Config\BIOGuiResources.ini
A R C:\Users\Nikolay\Documents\BioWare\Mass Effect\Config\BIOInput.ini
A C:\Users\Nikolay\Documents\BioWare\Mass Effect\Config\BIOParty.ini
A C:\Users\Nikolay\Documents\BioWare\Mass Effect\Config\BIOQA.ini
A C:\Users\Nikolay\Documents\BioWare\Mass Effect\Config\DefaultEngine.ini
Имена файлов знаю все.
нужно это? »
Ага.
И что интересно, из приведённого вывода и ранее приведённого Вами кода выясняется масса интересных, никак ранее не упоминавшихся подробностей. То, что Вы описывали в техзадании, имеет мало общего с тем, что Вам на самом деле нужно.
Покажите реально используемый Вами код, не с «set "GetFolder1=folder 3"», а с тем, что там есть у Вас на самом деле.
Browning Zed
27-11-2018, 22:59
Покажите реально используемый Вами код, не с «set "GetFolder1=folder 3"», а с тем, что там есть у Вас на самом деле. »
Упростил код до безобразия, и вроде он заработал:
XCopy /y /k /r /e ".\Extras\Mouse\Config" "%UserProfile%\Documents\BioWare\Mass Effect\Config\"
Попытался дальше углубиться в язык CMD команд, и он не перестает меня удивлять.
Вот выражение аналогичное вышеприведенному, но с обращением к реестру:
for /f "tokens=3" %%i in ('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Personal') do set "root_doc=%%~i"
XCopy /y /k /r /e ".\Extras\Mouse\Config" "%root_doc%\BioWare\Mass Effect\Config\"
Теоретически, оба этих выражения должны возвращать один и тот же путь:
C:\Users\Nikolay\Documents\BioWare\Mass Effect\Config
и копировать по этому пути файлы, НО! - в первом случае это работает, а во втором - нет. Во втором варианте создается папка %UserProfile% в директории с батником, и файлы копируются туда. Что я делаю не так?
Теоретически, оба этих выражения должны возвращать один и тот же путь: »
и практически все как надо работает:
@echo off
set "var=HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders"
for /f "tokens=3" %%a in ('reg query "%var%"^|find /i "Personal"') do call set "root_doc=%%a"
if exist "%root_doc%\BioWare\Mass Effect\Config" echo Вместо echo пишем свою команду xcopy с нужными ключами и путями в "%root_doc%\BioWare\Mass Effect\Config"
pause
Browning Zed
28-11-2018, 00:01
и практически все как надо работает
Получился следующий код:
@echo off
set "var=HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders"
for /f "tokens=3" %%a in ('reg query "%var%"^|find /i "Personal"') do call set "root_doc=%%a"
if exist "%root_doc%\BioWare\Mass Effect\Config" (
XCopy /y /k /r /e ".\Extras\Controller\Config "%root_doc%\BioWare\Mass Effect\Config"
)
pause
Но он выдает ошибку интерпретации параметров. Полагаю, что дело в строке с пробелом в пути:
if exist "%root_doc%\BioWare\Mass Effect\Config"
Browning Zed, где выдаёт? Закомментируйте временно @echo off посредством rem и покажите результат выполнения в виде текста, обрамив его тэгом code.
Browning Zed
28-11-2018, 00:35
D:\Games\Store\Steam\steamapps\common\Mass Effect>rem @echo off
D:\Games\Store\Steam\steamapps\common\Mass Effect>set "var=HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders"
D:\Games\Store\Steam\steamapps\common\Mass Effect>for /F "tokens=3" %a in ('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders"|find /i "Personal"') do call set "root_doc=%a"
D:\Games\Store\Steam\steamapps\common\Mass Effect>call set "root_doc=%USERPROFILE%\Documents"
D:\Games\Store\Steam\steamapps\common\Mass Effect>if exist "C:\Users\Nikolay\Documents\BioWare\Mass Effect\Config" (XCopy /y /k /r /e ".\Extras\Controller\Config "C:\Users\Nikolay\Documents\BioWare\Mass Effect\Config" )
Ошибка интерпретации параметров
D:\Games\Store\Steam\steamapps\common\Mass Effect>pause
Для продолжения нажмите любую клавишу . . .
Browning Zed, закрывающую кавычку забыли при:
if exist "%root_doc%\BioWare\Mass Effect\Config" (
XCopy /y /k /r /e ".\Extras\Controller\Config" "%root_doc%\BioWare\Mass Effect\Config"
)
Browning Zed
28-11-2018, 10:27
Browning Zed, закрывающую кавычку »
Да, верно - моя невнимательность, извиняюсь. Теперь все работает как нужно.
Спасибо форумчанам Iska и alpap за помощь. Вопрос можно считать решенным.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.