Показать полную графическую версию : [решено] Поиск и копирование
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
и далее текст скрипта как он был ранее
А как быть если искать надо конкретное имя файла, и записать например потом путь в переменную ?
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
@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 кодировке.
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
Далее то же, что и в предыдущем случае
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 и рассматривайте что содержится в строках при исполнении батника, особенно в именах (путях) файлов - никаких лишних пробелов нигде в путях не должно быть. Будет время, нарисую скрипт, который будет убивать конечные пробелы.
megaloman, вот в этом и проблема при использовании переменных %FilePath%\%FileName2% в режиме Echo on пишет путь вот так : "C:\Program Files\папка\ \файл" и потом что не может обнаружить путь.
megaloman, еще раз все перепроверил и действительно похоже все дело в лишних пробелах, причем не в тех строках какие дают ошибки. Большое спасиб оза помощь.
Появился еще вопрос, а как организовать так что бы когда находится нужный файл далее поиск не происходил?
Или это невозможно осуществить через bat?
Смысл в каталоге по найденному файлу обновить другой файл. »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="
)
Вот это именно то что и было нужно. Большое спасибо за помощь.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.