Войти

Показать полную графическую версию : [решено] Поиск и копирование


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

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

megaloman
25-05-2011, 19:00
@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
Если в пути есть символы кириллицы, например:
\\server\profile\Рога и копыта\db\
то скрипт следует обязательно записат в 866 кодировке (например, в редакторе файл-менеджера FAR),
либо (если, например, в стандартном блокноте), начать вот таким образом

@Echo Off
chcp 1251

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

profcom
02-06-2011, 09:54
А как быть если искать надо конкретное имя файла, и записать например потом путь в переменную ?

megaloman
02-06-2011, 16:48
@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
Продолжение истории с поиском файла и копирование откуда -куда.
@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
@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
Ну это MS придумал.
Я так понимаю тут папка создается автоматически?! Это не сработает в нашем случае...
Это папка от Microsoft Outlook создается она автоматом ... по сиду пользователя

Butunin Klim
09-06-2011, 13:52
Megaloman
Привет.

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

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

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

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

profcom
13-06-2011, 18:58
@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
У меня работает! Правда, не сразу: я скопировал Ваш код, вставил в текстовый редактор FAR, обнаружил, что на конце Ваших строкSet Dir=D:\
Set FileName=Конкретное имя файла.txt
есть лишние пробелы. Проверьте, чтобы их не было. Сделайте Echo On в начале, посмотрите, как батник выполняется. Какие пути файла получаются в For. И, надеюсь, коль у Вас русские буквы, Вы сделали батник в 866 кодировке.

profcom
14-06-2011, 10:48
megaloman, А теперь понимаю в чем причина, файл я ищу на разных дисках, а ты как я поминаю указываешь на корень диска D ?

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

megaloman
15-06-2011, 12:11
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
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
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
megaloman, вот в этом и проблема при использовании переменных %FilePath%\%FileName2% в режиме Echo on пишет путь вот так : "C:\Program Files\папка\ \файл" и потом что не может обнаружить путь.

profcom
17-06-2011, 10:26
megaloman, еще раз все перепроверил и действительно похоже все дело в лишних пробелах, причем не в тех строках какие дают ошибки. Большое спасиб оза помощь.

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

profcom
27-06-2011, 21:26
Или это невозможно осуществить через bat?

amel27
28-06-2011, 08:23
Смысл в каталоге по найденному файлу обновить другой файл. »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"
)
как организовать так что бы когда находится нужный файл далее поиск не происходил? »отменить поиск текущего диска (прервать работу 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
Вот это именно то что и было нужно. Большое спасибо за помощь.




© OSzone.net 2001-2012