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

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

Browning Zed 21-11-2018 20:32 2841958

bat. Копирование папок из текущей директории
 
Здравствуйте.
Как написать батник который копировал бы папки относительно текущей директории, т.е. папки где лежит сам bat-файл? Необходимо:
1. Скопировать из "текущая директория\ folder 111" в "уровень выше текущей директории"
3. Скопировать из "текущая директория\ folder 222" в "C:\Users\User_Name\Documents"


В первом случае надо скопировать папку «folder 111», расположенную директорией ниже в папку директорией выше. Во втором примере папку «folder 222», расположенную директорией ниже в системную папку "Документы".

Iska 21-11-2018 22:20 2841974

Цитата:

Цитата Browning Zed
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

Цитата:

Цитата Browning Zed
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 2841984

Цитата:

Если под User_Name подразумевается текущий пользователь, то:
Да, все верно, текущий пользователь. Последний код отлично работает, спасибо. :up
Но с первым кодом, где копируем на уровень выше не получилось. Дело в том, что батник запускается через exe-файл лежащий в другом месте, и папка копируется на уровень выше той папки где находится экзешник, а не там где лежит bat. И еще непонятен момент с более глубокими по вложенности уровнями папок, например таким образом:
Скопировать из "текущая директория\folder 1\ folder 2\ folder 3" в "уровень выше текущей директории"

Iska 22-11-2018 00:30 2841998

Цитата:

Цитата Browning Zed
батник запускается через exe-файл лежащий в другом месте, и папка копируется на уровень выше той папки где находится экзешник, а не там где лежит bat. »

Разумеется, так и должно быть. Если исполняемый файл запускается напрямую из Проводника — его текущим каталогом будет место его расположения. Если этот исполняемый файл запускает пакетный файл без изменения своего текущего каталога и без каких-то дополнительных условий — текущим каталогом для пакетного файла также будет место расположения исполняемого файла. И именно там пакетный файл будет ожидать найти каталог «folder 111». Как и заказывалось.

Меня терзают смутные сомнения, что Вы путаете понятия «текущий каталог» и «каталог, в котором расположен пакетный файл».

Цитата:

Цитата Browning Zed
И еще непонятен момент с более глубокими по вложенности уровнями папок, например таким образом:
Скопировать из "текущая директория\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 2842152

Цитата:

Цитата Iska
Меня терзают смутные сомнения, что Вы путаете понятия «текущий каталог» и «каталог, в котором расположен пакетный файл »

Да, так и есть, извиняюсь - тут я перепутал.
Спасибо за помощь, с путями копирования вроде разобрался. Но остался один нерешенный вопрос. Копирую через батник папку с файлами в системную папку «Документы». Добавил в код батника ключ: /y, чтобы файлы перезаписывались, но файлам находящимся в папке «Документы» присвоен атрибут «Только чтение», что в итоге влечет запись в командной строке: "Отказано в доступе". Файлы, соответственно, не перезаписываются и ключ: /r не помогает. Как можно выйти из данной ситуации?

Iska 22-11-2018 18:46 2842159

Цитата:

Цитата Browning Zed
но файлам находящимся в папке «Документы» присвоен атрибут «Только чтение» »

Зачем это было сделано? Очень странно.

Покажите.

Browning Zed 22-11-2018 19:00 2842163

Цитата:

Цитата Iska
Зачем это было сделано? Очень странно.
Покажите. »

Это файлы конфигурации игры (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, должен сохранить атрибут «только чтение» у нового файла (который перезаписывает старый). Но этого не происходит.

Iska 22-11-2018 19:14 2842166

Цитата:

Цитата Browning Zed
Это файлы конфигурации игры (ini файлы), »

Ясно. И всё же — покажите. Посредством attrib.exe.

P.S. Вы знаете имена всех этих файлов?

Browning Zed 22-11-2018 19:33 2842170

Цитата:

Цитата Iska
Ясно. И всё же — покажите. Посредством 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

Имена файлов знаю все.

Iska 25-11-2018 01:44 2842471

Цитата:

Цитата Browning Zed
нужно это? »

Ага.

И что интересно, из приведённого вывода и ранее приведённого Вами кода выясняется масса интересных, никак ранее не упоминавшихся подробностей. То, что Вы описывали в техзадании, имеет мало общего с тем, что Вам на самом деле нужно.

Покажите реально используемый Вами код, не с «set "GetFolder1=folder 3"», а с тем, что там есть у Вас на самом деле.

Browning Zed 27-11-2018 22:59 2842964

Цитата:

Цитата Iska
Покажите реально используемый Вами код, не с «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% в директории с батником, и файлы копируются туда. Что я делаю не так?

alpap 27-11-2018 23:29 2842981

Цитата:

Цитата Browning Zed
Теоретически, оба этих выражения должны возвращать один и тот же путь: »

и практически все как надо работает:
Код:

@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 2842987

Цитата:

Цитата alpap
и практически все как надо работает

Получился следующий код:
Код:

@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"

Iska 28-11-2018 00:25 2842988

Browning Zed, где выдаёт? Закомментируйте временно @echo off посредством rem и покажите результат выполнения в виде текста, обрамив его тэгом code.

Browning Zed 28-11-2018 00:35 2842994

Код:

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
Для продолжения нажмите любую клавишу . . .


Iska 28-11-2018 02:29 2843001

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 2843031

Цитата:

Цитата Iska
Browning Zed, закрывающую кавычку »

Да, верно - моя невнимательность, извиняюсь. Теперь все работает как нужно.
Спасибо форумчанам Iska и alpap за помощь. Вопрос можно считать решенным.


Время: 09:46.

Время: 09:46.
© OSzone.net 2001-