Компьютерный форум 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=207557)

Butunin Klim 25-05-2011 18:37 1682463

Поиск и копирование
 
Суть вопроса такова.
Есть папка с dbx файлами, но имя папки меняется постоянно, по этому нужно найти в этой папке подпаку которая меняет название. (я так понимаю просто нужно найти файлы с dbx расширением.)
Путь к папке \\server\profile\%username%\db\имя случайной папки\*.dbx

есть путь куда это надо скопировать. Не пойму как сделать... кто смыслит хелп! путь \\server2\profile\%username%\db\

megaloman 25-05-2011 19:00 1682471

Код:

@Echo Off
Set Otkuda=\\server\profile\%username%\db\
Set Kuda=\\server2\profile\%username%\db\

FOR /R "%Otkuda%" %%i IN (*.dbx) DO Copy "%%i" "%Kuda%" >nul

Если копируемых файлов много, то быстрее, возможно, будет работать вот такой цикл вместо предыдущего
Код:

FOR /F "usebackq delims=" %%i IN (`DIR %Otkuda% /b /A:D`) DO if Exist "%Otkuda%%%i\*.dbx" xcopy "%Otkuda%%%i\*.dbx" %Kuda% /Q /Y /R /C >nul

megaloman 01-06-2011 19:28 1686607

Если в пути есть символы кириллицы, например:
\\server\profile\Рога и копыта\db\
то скрипт следует обязательно записат в 866 кодировке (например, в редакторе файл-менеджера FAR),
либо (если, например, в стандартном блокноте), начать вот таким образом

@Echo Off
chcp 1251

и далее текст скрипта как он был ранее

profcom 02-06-2011 09:54 1686919

А как быть если искать надо конкретное имя файла, и записать например потом путь в переменную ?

megaloman 02-06-2011 16:48 1687168

Код:

@Echo Off

Set Dir=D:\
Set FileName=Конкретное имя файла.txt

FOR /F "usebackq delims=" %%i IN (`Dir /b /s /A:-D "%Dir%%FileName%"`) DO Call :PathFile "%%i"
GoTo :Eof

:PathFile
Set FilePath=%~dp1
Echo %FilePath%

GoTo :Eof

Смотрите выше замечание о кодировке

Butunin Klim 08-06-2011 15:01 1690699

Продолжение истории с поиском файла и копирование откуда -куда.
@Echo Off
Set Otkuda=\\server\profile\%username%\db\
Set Kuda=\\server2\profile\%username%\db\

с откуда разобрались тут все гуд.
Теперь вопрос встал ребром.
в папке
\\server2\profile\%username%\db\
Создается подпапка со случайным именем если ли возможность перехода на следующию папку ниже уровнем в дереве.
Тобиш
\\server2\profile\%username%\db\%random%
и туда запихнуть то что было найдено с перезатеранием всего что там есть. (папку создавать руками нельзя)

megaloman 08-06-2011 17:38 1690867

Код:

@Echo Off
Set Otkuda=\\server\profile\%username%\db\
Set Kuda=\\server2\profile\%username%\db\

Set Ran=0000%RANDOM%
Set Ran=%Ran:~-5%

md "%Kuda%%Ran%

FOR /R "%Otkuda%" %%i IN (*.dbx) DO Copy "%%i" "%Kuda%%Ran%\" >nul

0000 добавил чтобы выровнять все случайные наименования по длине (5 символов). По моему мнению, давать имя папке случайным образом- плохая идея. Лучше-по времени создания
Код:

Set Ran=%Date:~6,4%%Date:~3,2%%Date:~0,2%%Time:~0,2%%Time:~3,2%%Time:~6,2%%Time:~9,2%

Butunin Klim 08-06-2011 22:22 1691089

Ну это MS придумал.
Я так понимаю тут папка создается автоматически?! Это не сработает в нашем случае...
Это папка от Microsoft Outlook создается она автоматом ... по сиду пользователя

Butunin Klim 09-06-2011 13:52 1691406

Megaloman
Привет.

Смотри. При запуске аутлука у пользователя создается папка в "kyda"
Создается она автоматически имя берется от сида пользователя.

Задача следующая. У нас есть сервер где назодятся старые базы с письмами аутлука в формате Входящие.dbx отправленные.dbx и тд.

Задача при первом входе пользователя и запуска аутлука что бы скрипт сам нашел на сервере текущие dbx и скопировал в профиль пользователя по пути "kyda" + вот этот сид который создается.

Я не могу понять как сохранить эти файлы в путь "kyda"\SID

profcom 13-06-2011 18:58 1693730

Код:

@Echo Off 

Set Dir=D:\
Set FileName=Конкретное имя файла.txt 

FOR /F "usebackq delims=" %%i IN (`Dir /b /s /A:-D "%Dir%%FileName%"`) DO Call :PathFile "%%i"

GoTo :Eof 

:PathFile
Set FilePath=%~dp1
Echo %FilePath% 

GoTo :Eof

Не сработало, или я что не так понял, но после обработки пишет устройство не готово и файл не находит.
и ищет на диске D, хотя нам нужно определить и букву диска.

megaloman 14-06-2011 01:23 1693944

У меня работает! Правда, не сразу: я скопировал Ваш код, вставил в текстовый редактор FAR, обнаружил, что на конце Ваших строк
Код:

Set Dir=D:\
Set FileName=Конкретное имя файла.txt

есть лишние пробелы. Проверьте, чтобы их не было. Сделайте Echo On в начале, посмотрите, как батник выполняется. Какие пути файла получаются в For. И, надеюсь, коль у Вас русские буквы, Вы сделали батник в 866 кодировке.

profcom 14-06-2011 10:48 1694104

megaloman, А теперь понимаю в чем причина, файл я ищу на разных дисках, а ты как я поминаю указываешь на корень диска D ?

по моей задаче он может оказаться где угодно

megaloman 15-06-2011 12:11 1694796

profcom, Как спрошено, так и отвечено :read: Вот вариант с опросом всех дисков
Код:

@Echo Off
cls 
Set FileName=Конкретное имя файла.txt 


FOR %%d IN (C D E F G H I J K L M N O P Q R S T U V W X Y Z) DO Call :SetDir %%d:\
GoTo :Eof

:SetDir

Set Dir=%~1

If Not Exist %Dir% GoTo :Eof
Echo +++ Ищем в %1

FOR /F "usebackq delims=" %%i IN (`Dir /b /s /A:-D "%Dir%%FileName%"`) DO Call :PathFile "%%i"
GoTo :Eof 

:PathFile
Set FilePath=%~dp1
Echo %FilePath%  %1 

GoTo :Eof

А если не надо по всем дискам, а только в некоторых указанных местах, то вот еще вариант
Код:

@Echo Off
cls 
Set FileName=Конкретное имя файла.txt 

Call :SetDir D:\
Call :SetDir "E:\Во поле берёзка стояла\"
Call :SetDir H:\
Call :SetDir E:\Delete\

GoTo :Eof

:SetDir
Далее то же, что и в предыдущем случае


profcom 16-06-2011 17:12 1695722

megaloman, Не подскажешь как развить дальше батник, не удается обновить файл. Пишет что не может найти путь. Смысл в каталоге по найденному файлу обновить другой файл.
Код:

@Echo On
cls

Set FileName=файл.txt 
Set FileName2=файл.exe 
FOR %%d IN (C D E F G H I J K L M N O P Q R S T U V W X Y Z) DO Call :SetDir %%d:\
GoTo :Eof 

:SetDir 
Set Dir=%~1 

If Not Exist %Dir% GoTo :Eof
Echo Ищем в %1 

FOR /F "usebackq delims=" %%i IN (`Dir /b /s /A:-D "%Dir%%FileName%"`) DO Call :PathFile "%%i" 
GoTo :Eof   

:PathFile 
Set FilePath=%~dp1 
Echo %FilePath%  %1   
Del "%FilePath%\%FileName2%" /q/f/a/s
xCOPY "%TEMP%\%FileName2%" "%FilePath%" /Q /Y /R /C 

GoTo :Eof


megaloman 16-06-2011 21:58 1695943

profcom, У Вас всё верно, но, похоже, болезнь всё та же: мешают лишние конечные пробелы в строках. Главные неприятности в строках

Set FileName=файл.txt
Set FileName2=файл.exe
FOR %%d IN (C D E F G H I J K L M N O P Q R S T U V W X Y Z) DO Call :SetDir %%d:\

Set Dir=%~1

Set FilePath=%~dp1

Я убрал пробелы, батник отработал. В таких случаях делайте Echo on и рассматривайте что содержится в строках при исполнении батника, особенно в именах (путях) файлов - никаких лишних пробелов нигде в путях не должно быть. Будет время, нарисую скрипт, который будет убивать конечные пробелы.

profcom 16-06-2011 22:09 1695949

megaloman, вот в этом и проблема при использовании переменных %FilePath%\%FileName2% в режиме Echo on пишет путь вот так : "C:\Program Files\папка\ \файл" и потом что не может обнаружить путь.

profcom 17-06-2011 10:26 1696164

megaloman, еще раз все перепроверил и действительно похоже все дело в лишних пробелах, причем не в тех строках какие дают ошибки. Большое спасиб оза помощь.

Появился еще вопрос, а как организовать так что бы когда находится нужный файл далее поиск не происходил?

profcom 27-06-2011 21:26 1702549

Или это невозможно осуществить через bat?

amel27 28-06-2011 08:23 1702741

Цитата:

Цитата profcom
Смысл в каталоге по найденному файлу обновить другой файл. »

Код:

Set "FFind=файл.txt"
Set "FCopy=%TEMP%\файл.exe"

For %%d IN (C D E F G H I J K L M N O P Q R S T U V W X Y Z) Do If Exist "%%d:\" (
For /F "Delims=" %%i IN ('DIR/B/S/A-D "%%d:\%FFind%"') Do Copy/Y "%FCopy%" "%%~dpi"
)

Цитата:

Цитата profcom
как организовать так что бы когда находится нужный файл далее поиск не происходил? »

отменить поиск текущего диска (прервать работу DIR) нельзя, но можно пропустить сканирование других дисков и/или копирование файла:
Код:

Set "FFind=файл.txt"
Set "FCopy=%TEMP%\файл.exe"

For %%d IN (C D E F G H I J K L M N O P Q R S T U V W X Y Z) Do If Exist "%%d:\" If Defined FFind (
For /F "Delims=" %%i IN ('DIR/B/S/A-D "%%d:\%FFind%"') Do If Defined FFind Copy/Y "%FCopy%" "%%~dpi"&& Set "FFind="
)


profcom 28-06-2011 11:34 1702849

Вот это именно то что и было нужно. Большое спасибо за помощь.


Время: 11:08.

Время: 11:08.
© OSzone.net 2001-