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

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

magarjoba 14-02-2017 17:13 2711732

Скопировать в папку, зная только часть ее Имени
 
Всем привет , и снова обращаюсь за помощью гуру,

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

ЕСТЬ диски 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 2711767

Код:

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

Цитата:

Цитата megaloman
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 2711777

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 2711788

чтоб вы понимали правильно
это разливалка профиля аимп на подсеть компов для определенных юзеров

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


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

Код:

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

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

Для меня конструкция echo a| совершенно непонятна, но соль не в этом.
Цитата:

Цитата Читайте хелп по команде Xcopy /?
/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 2711822

Цитата:

Цитата megaloman
Для меня конструкция echo a| совершенно непонятна »

обьясню кратко :
использую на локальном компе PxExec
Скрытый текст



как видно из скриншота
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 2711888

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

magarjoba 15-02-2017 10:48 2711900

Цитата:

Цитата megaloman
Рабочий стол расположен C:\Users\sh*\Desktop\ »

да , расположен C:\Documents and Settings\sh*\Рабочий стол во всех случаях

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

megaloman 15-02-2017 11:12 2711915

Код:

@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



Время: 01:34.

Время: 01:34.
© OSzone.net 2001-