Показать полную графическую версию : [решено] Как проверить в определённой директории наличие файлов (не подкаталогов!) ?
SANIOK_AV
03-03-2009, 12:05
Доброго времени суток!
Ситуация такая:
есть к примеру каталог D:\aaa\
в нём к примеру есть подкаталоги:
D:\aaa\1\
D:\aaa\2\
D:\aaa\333\
я в батнике хочу проверять или не появились в D:\aaa\ какието файлы
пробую сделать так:
if exist D:\aaa\*.* goto 1
goto end
:1
echo "есть файлы"
:end
не получается...
батник отрабатывает даже если файлов нет... (((
Подскажите пожалуйста как проанализировать на наличие в этом каталоге именно файлов ане подкаталогов?
Заранее благодарен!
видимо реагирует на подкаталоги...
SANIOK_AV, попробуйте так:
copy D:\aaa\*.* D:\aaa\test.tmp && goto 1
goto end
:1
del D:\aaa\test.tmp
echo "есть файлы"
:end
Petya V4sechkin
03-03-2009, 12:40
SANIOK_AV, или так (без Copy):
dir D:\aaa\* /a-d 2>nul >nul && goto 1
goto end
:1
echo есть файлы
:end
SANIOK_AV
03-03-2009, 14:10
gora, Petya V4sechkin, Спасибо огромное!!!
Petya V4sechkin,
а как работает dir D:\aaa\* /a-d 2
?
/a-d значит не каталоги...
а что значит "2" ?
и что значит
>nul >nul
?
и ещё вопрос:
вместо * можно задать маску например qwer*.123 ?
Petya V4sechkin
03-03-2009, 14:52
а что значит "2" ?
и что значит
>nul >nul
?
Конструкция 2>nul означает, что сообщения об ошибках (стандартный поток stderr) перенаправляются в nul (то есть, скрываются). Иначе команда Dir выдавала бы ошибку "Файл не найден" при отсутствии файлов.
Просто >nul перенаправляет обычные сообщения (stdout) в nul.
Комбинация 2>nul >nul - полностью "тихий" режим (убирает и stdout, и stderr).
вместо * можно задать маску например qwer*.123 ?
Да.
SANIOK_AV
03-03-2009, 15:08
Petya V4sechkin,
то есть если команде dir /a-d есть что показать, то на это направляет в null и переходит на метку "1"
я правильно понял?
SANIOK_AV
03-03-2009, 16:26
и ещё вопросик:
если в этом каталоге (D:\aaa\) уже есть изначально файлы....
и мне надо отследить появление новых файлов...
как это можно реализовать?
заранее благодарен!!!
Petya V4sechkin
03-03-2009, 22:29
SANIOK_AV, можно сравнивать списки файлов до и после (хотя при этом будут отслеживаться не только появившиеся новые файлы, но и удаленные). К примеру, сначала создаем список во временном lst1.tmp:
dir D:\aaa\* /a-d /b /on 2>nul >lst1.tmp
Потом чего-то у нас происходит, делаем второй список lst2.tmp и сравниваем (пользуясь тем, что команда Fc возвращает код в ErrorLevel):
dir D:\aaa\* /a-d /b /on 2>nul >lst2.tmp
fc lst1.tmp lst2.tmp >nul && goto end
echo список файлов изменен
:end
del lst1.tmp
del lst2.tmp
SANIOK_AV
04-03-2009, 10:57
Petya V4sechkin, огромное СПАСИБО!!! :oszone:
Devils0411
13-07-2009, 16:11
Похожая ситуация только немного другого плана.
Скажем есть тебе папки:
D:\aaa\1\
D:\aaa\2\
D:\aaa\333\
Необходимо проверить во всех папках наличие файлов *.inf Есть такой имеется, то записать его путь в D:\aaa\path.txt (Батник будет запускаться с D:\)
И еще попутный вопрос. Возможно ли записывать эти пути не на первые строки, а начиная со строки например 82?
Devils0411, попробуйте так:@Echo Off
:: 81 пустая строка
For /L %%I In (1,1,81) Do Echo.>> D:\aaa\path.txt
:: с 82-й строки перечень *.inf файлов с полными путями (вложенные каталоги не проверяются)
For %%I In (
D:\aaa\1
D:\aaa\2
D:\aaa\333
) Do For /F "UseBackQ" %%a In (`Dir %%I /B /ON 2^>nul`) Do If /i %%~sxa==.inf Echo %%I\%%a>> D:\aaa\path.txt
Devils0411
13-07-2009, 17:47
gora, а в чем загвоздка проверять вложенные?
а в чем загвоздка проверять вложенные? »
Решение соответствует поставленной задаче. О проверке вложенных папок речи не было.
Можете добавить в перечень и вложенные папки, если они известны:...
For %%I In (
D:\aaa\1
D:\aaa\2
D:\aaa\2\444
D:\aaa\333\555
D:\aaa\333\666\777
...
Devils0411
13-07-2009, 18:04
Моя ошибка, не дописал до конца. В этих трех папках, большое количество подпапок, и писать путь к каждой равносильно копированию путей каждой папки вручную.
Пробуй так:
@Echo off
SetLocal EnableDelayedExpansion
SetLocal EnableExtensions
set WrkDir=D:\aaa
set Dst=Path.txt
set EmptyLns=82
for /R %WrkDir%\ %%F in (*.inf) do (
if not exist "%WrkDir%\%Dst%" for /L %%L in (1,1,%EmptyLns%) do Echo. >>"%WrkDir%\%Dst%"
Echo %%F>>"%WrkDir%\%Dst%"
)
type "%WrkDir%\%Dst%"
последняя строчка необязательна. Только найденные файлы будут добавляться и добавляться. Либо *.inf файлы нужно потом убирать либо проверять, как уже найденные (в зависимости от того, что нужно на выходе)
Devils0411
13-07-2009, 18:41
Суть такая: Есть папка "aaa" в ней огромное количество подпапок. В большенстве этих папок есть файлы .inf Необходим батник, который проверял бы наличие inf файлов. Если Inf файл есть в папке скажем D:\aaa\vvv\qqq\3\t, то записывал путь в текстовый файл, например в path.txt, и вписывать начинал с 82 строки.
Эту часть я реализовал в примере выше.
Поясню:
При повторном запуске, если файл Path.txt уже есть, то ВСЕ *.INF файлы из всех подкаталого будут заново добавлены в конец файла Path.txt, в противном случае этот файл будет создан, в нем будет 82 пустые строки, а затем пойдет список всех *.INF файлов.
хотелось бы усовершенствовать этот вариант:
dir D:\aaa\* /a-d 2>nul >nul && goto 1
goto end
:1
echo есть файлы
:end
как сделать, чтобы файл отрабатывал каждые допустим 5 минут, контролируя появление файлов в папке?
отрабатывал каждые допустим 5 минут »без проблем - паузой (http://www.oszone.net/6160) или штатным планировщиком
контролируя появление файлов в папке »слишком туманно, по-возможности, формулируйте задачу конкретней
любых файлов?.. только новых?.. что делать с этим списком?.. и т.д.
amel27, обычно папка пуста, но как только в ней появится любой файл, выдать сообщение
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.