PDA

Показать полную графическую версию : [решено] Как проверить в определённой директории наличие файлов (не подкаталогов!) ?


Страниц : [1] 2

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
не получается...
батник отрабатывает даже если файлов нет... (((
Подскажите пожалуйста как проанализировать на наличие в этом каталоге именно файлов ане подкаталогов?
Заранее благодарен!
видимо реагирует на подкаталоги...

gora
03-03-2009, 12:31
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?

gora
13-07-2009, 17:35
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, а в чем загвоздка проверять вложенные?

gora
13-07-2009, 17:58
а в чем загвоздка проверять вложенные? »
Решение соответствует поставленной задаче. О проверке вложенных папок речи не было.
Можете добавить в перечень и вложенные папки, если они известны:...
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
Моя ошибка, не дописал до конца. В этих трех папках, большое количество подпапок, и писать путь к каждой равносильно копированию путей каждой папки вручную.

NiOl
13-07-2009, 18:28
Пробуй так:

@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 строки.

NiOl
13-07-2009, 19:02
Эту часть я реализовал в примере выше.
Поясню:
При повторном запуске, если файл Path.txt уже есть, то ВСЕ *.INF файлы из всех подкаталого будут заново добавлены в конец файла Path.txt, в противном случае этот файл будет создан, в нем будет 82 пустые строки, а затем пойдет список всех *.INF файлов.

Hector
20-06-2011, 23:44
хотелось бы усовершенствовать этот вариант:

dir D:\aaa\* /a-d 2>nul >nul && goto 1
goto end
:1
echo есть файлы
:end

как сделать, чтобы файл отрабатывал каждые допустим 5 минут, контролируя появление файлов в папке?

amel27
21-06-2011, 10:05
отрабатывал каждые допустим 5 минут »без проблем - паузой (http://www.oszone.net/6160) или штатным планировщиком
контролируя появление файлов в папке »слишком туманно, по-возможности, формулируйте задачу конкретней
любых файлов?.. только новых?.. что делать с этим списком?.. и т.д.

Hector
21-06-2011, 10:14
amel27, обычно папка пуста, но как только в ней появится любой файл, выдать сообщение




© OSzone.net 2001-2012