Войти

Показать полную графическую версию : Скопировать в папку, зная только часть ее Имени


magarjoba
14-02-2017, 17:13
Всем привет , и снова обращаюсь за помощью гуру,

наподобие я в ветке одну тему нашел , но она не подходит
у меня следущая ситуация

ЕСТЬ диски M: и С:
Необходимо c диска M:\temp\AIMP "вот эту папку AIMP" скопировать во
все папки на диске С по заданному пути
имя папок всегда будет начинаться sh
C:\Documents and Settings\sh***\Application Data

если в одной из этих папок она уже есть , то делаем полность замену

как я это представляю путь диска M не прописую т.к. deploy.cmd файл лежит в корне M:\temp\
taskkill /F /T /IM AIMP.exe
chcp 1251 >nul
echo a| xcopy "AIMP" "C:\Documents and Settings\Default User\Application Data\AIMP\" /s /e
echo a| xcopy "AIMP" "C:\Documents and Settings\All Users\Application Data\AIMP\" /s /e
echo a| xcopy "AIMP" "C:\Documents and Settings\administrator\Application Data\AIMP\" /s /e
echo a| xcopy "Музыка.lnk" "C:\Documents and Settings\All Users\Рабочий стол" /s /e
-------------
а вот как сделать если будет C:\Documents and Settings\sh***\Application Data ??

megaloman
14-02-2017, 18:47
@Echo Off

Set "BoxIn=Z:\temp\AIMP"

Set "BoxOut=Z:\Documents and Settings\sh*"
Set "BoxOutEnd=Application Data\AIMP"

FOR /F "usebackq delims=" %%d IN (`Dir /b /s /a:d "%BoxOut%" 2^>nul`) DO (
If Not Exist "%%d\%BoxOutEnd%" Md "%%d\%BoxOutEnd%"
xcopy /E /Y "%BoxIn%\*.*" "%%d\%BoxOutEnd%\" >nul
)
Пропишите свои пути. Убедитесь, что в эти папки есть доступ. У меня по умолчанию доступа к папке "C:\Documents and Settings" нет.


Извините за наглость, что я влез, хотя я не гуру и никогда им не стану. “Я год не был в бане. Я старый. Меня девушки не любят“

magarjoba
14-02-2017, 19:03
Set "BoxOutEnd=Application Data\AIMP" »
спасибо

вопрос по коду , для чего нам BoxOutEnd ?

и если в этом коде в первой строке Set "BoxIn=Z:\temp\AIMP"
не прописывать полный путь, чтобы этот код работал не важно где

просто получается если в данном случае я допустим имею на диске Z папку temp внутри которой батник + эта подпапка

если вдруг корень меняется z:1\temp или m:\temp и т.д. код не работает т.к. жесткая ссылка...


@Echo Off

Set "BoxIn=AIMP" ------если не указывать путь и запускать так ??

Set "BoxOut=Z:\Documents and Settings\sh*" - тут понятно что путь не поменяется
Set "BoxOutEnd=Application Data\AIMP" - вот я не понял зачем это

FOR /F "usebackq delims=" %%d IN (`Dir /b /s /a:d "%BoxOut%" 2^>nul`) DO (
If Not Exist "%%d\%BoxOutEnd%" Md "%%d\%BoxOutEnd%"
xcopy /s /e /y "%BoxIn%\*.*" "%%d\%BoxOutEnd%\" >nul
)

забыл сказать домысел
Set "BoxOutEnd=Application Data\AIMP" это скорее всего именно замена
т к я по "деревенски " делаю и соглашаюсь на перезапись вот этой командой echo a| xcopy с доп ключами
вы сделали это другим способом . я прав!?

megaloman
14-02-2017, 19:40
magarjoba, Не понял вопроса.
Вам надо организовать поиск папок
C:\Documents and Settings\sh***\Application Data\Aimp
Я не знаю, как это сделать: предупреждал ведь, что я не гуру. Поэтому ищу способ.
Делю ваш путь на 2 части:
C:\Documents and Settings\sh*** - это я могу перебрать командой Dir.
Далее по полученному пути я достраиваю вторую часть
C:\Documents and Settings\sh_конкретное + \Application Data\Aimp =
C:\Documents and Settings\sh_конкретное\Application Data\Aimp
Единственное, я поленился уточнить у Вас, обязательно ли в папке sh_конкретное должна существовать подпапка Application Data\Aimp Я наглым образом её создаю, если её нет. Если я не прав - это решаемо.

Я предпочитаю, чтобы батник мог запускаться из любого места, поэтому жестко прописываю пути.
Если батник в папке рядом с подпапкой AIMP, можно сделать так:@Echo Off

Set "BoxIn=%~dp0AIMP"

Set "BoxOut=Z:\Documents and Settings\sh*"
Set "BoxOutEnd=Application Data\AIMP"

FOR /F "usebackq delims=" %%d IN (`Dir /b /s /a:d "%BoxOut%" 2^>nul`) DO (
If Not Exist "%%d\%BoxOutEnd%" Md "%%d\%BoxOutEnd%"
xcopy /E /Y "%BoxIn%\*.*" "%%d\%BoxOutEnd%\" >nul
)
И путь к папке с батником ручками указывать не нужно.
Кстати, не уточнил, что Вы имели ввиду "делаем полностью замену" - может перед копированием надо вычистить всё в папке C:\Documents and Settings\sh_конкретное\Application Data\Aimp если она ранее была? А за перезапись без вопросов отвечает ключ /Y в Xcopy

magarjoba
14-02-2017, 21:33
чтоб вы понимали правильно
это разливалка профиля аимп на подсеть компов для определенных юзеров

т.е. вычищать папку необязательно, а просто копирование папки с полностью заменой содержимого


вот смотри скину тебе полностью код как я все проделываю

@echo "unistall install program"
@echo "\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"
@echo "\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"
@echo "\\\\\\\\\\\\\START\\\\\\\\\\\\\\\\\"
@echo "\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"
@echo " "
@echo off
taskkill /F /T /IM winamp.exe
taskkill /F /T /IM AIMP.exe
@echo "\\\\\\\\\0_inst_aimp\\\\\\\\\\\\\\\"
aimp_4.02.1725.exe /SILENT /AUTO /REG=R
@echo off
chcp 1251 >nul
Set "BoxIn=M:\tempfrommusic_install\AIMP"
Set "BoxOut=C:\Documents and Settings\sh*"
Set "BoxOutEnd=Application Data\AIMP"
FOR /F "usebackq delims=" %%d IN (`Dir /b /s /a:d "%BoxOut%" 2^>nul`) DO (
If Not Exist "%%d\%BoxOutEnd%" Md "%%d\%BoxOutEnd%"
xcopy /s /e /y "%BoxIn%\*.*" "%%d\%BoxOutEnd%\" >nul
)
echo a| xcopy "AIMP" "C:\Documents and Settings\Default User\Application Data\AIMP\" /s /e
echo a| xcopy "AIMP" "C:\Documents and Settings\administrator\Application Data\AIMP\" /s /e
echo a| xcopy "Музыка.lnk" "C:\Documents and Settings\All Users\Рабочий стол" /s /e
@echo "\\\\\`````\\\\NEXT\\\\\`````\\\\\\\"
@echo "\\\\\\\\\\0_cwRsync\\\\\\\\\\\\\\\\"
@echo off
echo a| xcopy "cwRsync" "c:\Program Files\cwRsync\" /s /e
REM ---------------Права для папок
CACLS c:\Progra~1\cwRsync /E /T /C /G "Все":F
REM ---------------Изменяем запись крона
@Echo Off
Set tabfile=c:\Progra~1\cron\cron.tab
(Echo #CRONTAB FILE
Echo # Classic crontab format:
Echo # Minutes Hours Days Months WeekDays Command
Echo #
Echo ##########################################################
Echo ###
Echo ### Музыка
Echo ###
Echo ##########################################################
Echo #
Echo @01 00-02 * * * "C:\Program Files\cwRsync\cwrsync.cmd"
Echo @01 08-18 * * * "C:\Program Files\cwRsync\cwrsync.cmd"
Echo #
Echo 13 */1 * * * net time \\10.100.0.1 /Y /SET
)>"%tabfile%"



Я протестил первоначальный код
он работает но на рабочий стол какого-то копирует папку AIMP и cwRsync

а именно он копирует в C:\Documents and Settings\All Users\Рабочий стол эти папки
после чего они появляются и из под админа, т.к. я на нем запускаю cmd-шник

megaloman
14-02-2017, 23:14
magarjoba, Не люблю копаться в чужом коде, но, похоже, мой кусок ни в чём не виноват.
От меня ускользает смысл, например, этой строки
echo a| xcopy "Музыка.lnk" "C:\Documents and Settings\All Users\Рабочий стол" /s /e

Для меня конструкция echo a| совершенно непонятна, но соль не в этом.
/S Копирует все папки и подпапки, кроме пустых.
/E Копирует все папки и подпапки, включая пустые.
То же самое, что и /S /E. Можно использовать для изменения /T.
То есть, даже если файлов "Музыка.lnk" в подпапках нет, то в папку "C:\Documents and Settings\All Users\Рабочий стол" успешно копируется все подпапки той папки, которая является текущей для батника, даже без содержимого.
Что написали, то и получили.
Кроме того, ИМХО для копирования просто файлов в текущей папке лучше использовать команду Copy, а не Xcopy. Или в Xcopy не использовать ключи и /S и /E, они в этом случае вредны.
В остальные строки не вчитывался.

Кстати, и в моих примерах лучше ограничиться одним ключом: или /S или /E в зависимости от необходимости копирования пустых папок. Я оставил /E.

magarjoba
15-02-2017, 01:16
Для меня конструкция echo a| совершенно непонятна »
обьясню кратко :
использую на локальном компе PxExec

http://i.piccy.info/i9/5c59aa9162259d677d9ba21c2fa6bd52/1487110458/72616/1119070/from_forum.jpg (http://piccy.info/view3/10847045/8d6676f995bd50bd7a3a9e34b1a6dd3c/)http://i.piccy.info/a3/2017-02-14-22-14/i9-10847045/764x218-r/i.gif (http://i.piccy.info/a3c/2017-02-14-22-14/i9-10847045/764x218-r)

как видно из скриншота
1 запускаю install****
2 install копирует файл program** на компы которые я указал в comp.txt
3 на удаленном компе распаковывается скачанный архив temp*** в указанную директорию
4 после чего выполняется сам батник

файл музыка.lnk находится как видишь в папке позле того как её разархивировали
и так. как я в PxExec через ключ W указал рабочубю папку на удаленных компах
то батник понимает что эти файлы лежат в той же папке где он находится

echo a| xcopy - я таким образом эмулирую соглашение на замену всех файлов если будут совпадения
типо a - это "all"

теперь я понял, что ключи именно для него не надо
------------------
подскажи могу ли я как-то замодить твою версию, чтоб этот гребанный ярлык копировался только на рабочий стол в профиля sh*** ?

megaloman
15-02-2017, 10:10
magarjoba, Рабочий стол расположен C:\Users\sh*\Desktop\ ???

magarjoba
15-02-2017, 10:48
Рабочий стол расположен C:\Users\sh*\Desktop\ »
да , расположен C:\Documents and Settings\sh*\Рабочий стол во всех случаях

desktop -не катит т.к. кто-то в свое время тупанул и на xp_sp3 вот так сделал образ с русскими путями

megaloman
15-02-2017, 11:12
@Echo Off
chcp 1251 >nul

Set "BoxIn=%~dp0"
rem Set "BoxIn=C:\temp"

Set "Prof=sh*"

Set "DS=C:\Documents and Settings"
Set "DSAimp=Application Data\AIMP"

rem Set "US=C:\Users"
rem Set "USdesk=Desktop"
Set "US=C:\Documents and Settings"
Set "USdesk=Рабочий стол"

Call :Profile "xcopy /E /H /Y" "%BoxIn%\AIMP\*.*" "%DS%\%Prof%" "%DSAimp%" 1
Call :Profile "xcopy /H /Y" "%BoxIn%\Музыка.lnk" "%US%\%Prof%" "%USdesk%"

GoTo :Eof

:Profile
FOR /F "usebackq delims=" %%d IN (`Dir /b /s /a:d %3 2^>nul`) DO (
If Not "%5"=="" If Not Exist "%%d\%~4" Md "%%d\%~4"
%~1 %2 "%%d\%~4\" >nul 2>nul
)
GoTo :Eof




© OSzone.net 2001-2012