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

SANIOK_AV 03-03-2009 12:05 1053622

Как проверить в определённой директории наличие файлов (не подкаталогов!) ?
 
Доброго времени суток!
Ситуация такая:
есть к примеру каталог 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 1053642

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 1053647

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 1053726

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 1053769

Цитата:

Цитата SANIOK_AV
а что значит "2" ?
и что значит
>nul >nul
?

Конструкция 2>nul означает, что сообщения об ошибках (стандартный поток stderr) перенаправляются в nul (то есть, скрываются). Иначе команда Dir выдавала бы ошибку "Файл не найден" при отсутствии файлов.

Просто >nul перенаправляет обычные сообщения (stdout) в nul.
Комбинация 2>nul >nul - полностью "тихий" режим (убирает и stdout, и stderr).

Цитата:

Цитата SANIOK_AV
вместо * можно задать маску например qwer*.123 ?

Да.

SANIOK_AV 03-03-2009 15:08 1053788

Petya V4sechkin,
то есть если команде dir /a-d есть что показать, то на это направляет в null и переходит на метку "1"
я правильно понял?

SANIOK_AV 03-03-2009 16:26 1053879

и ещё вопросик:
если в этом каталоге (D:\aaa\) уже есть изначально файлы....
и мне надо отследить появление новых файлов...
как это можно реализовать?
заранее благодарен!!!

Petya V4sechkin 03-03-2009 22:29 1054222

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 1054574

Petya V4sechkin, огромное СПАСИБО!!! :oszone:

Devils0411 13-07-2009 16:11 1166478

Похожая ситуация только немного другого плана.
Скажем есть тебе папки:
D:\aaa\1\
D:\aaa\2\
D:\aaa\333\
Необходимо проверить во всех папках наличие файлов *.inf Есть такой имеется, то записать его путь в D:\aaa\path.txt (Батник будет запускаться с D:\)

И еще попутный вопрос. Возможно ли записывать эти пути не на первые строки, а начиная со строки например 82?

gora 13-07-2009 17:35 1166558

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 1166569

gora, а в чем загвоздка проверять вложенные?

gora 13-07-2009 17:58 1166578

Цитата:

Цитата Devils0411
а в чем загвоздка проверять вложенные? »

Решение соответствует поставленной задаче. О проверке вложенных папок речи не было.
Можете добавить в перечень и вложенные папки, если они известны:
Код:

...
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 1166583

Моя ошибка, не дописал до конца. В этих трех папках, большое количество подпапок, и писать путь к каждой равносильно копированию путей каждой папки вручную.

NiOl 13-07-2009 18:28 1166604

Пробуй так:

Код:

@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 1166611

Суть такая: Есть папка "aaa" в ней огромное количество подпапок. В большенстве этих папок есть файлы .inf Необходим батник, который проверял бы наличие inf файлов. Если Inf файл есть в папке скажем D:\aaa\vvv\qqq\3\t, то записывал путь в текстовый файл, например в path.txt, и вписывать начинал с 82 строки.

NiOl 13-07-2009 19:02 1166634

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

Hector 20-06-2011 23:44 1698553

хотелось бы усовершенствовать этот вариант:
Код:

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

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

amel27 21-06-2011 10:05 1698676

Цитата:

Цитата Hector
отрабатывал каждые допустим 5 минут »

без проблем - паузой или штатным планировщиком
Цитата:

Цитата Hector
контролируя появление файлов в папке »

слишком туманно, по-возможности, формулируйте задачу конкретней
любых файлов?.. только новых?.. что делать с этим списком?.. и т.д.

Hector 21-06-2011 10:14 1698682

amel27, обычно папка пуста, но как только в ней появится любой файл, выдать сообщение

amel27 21-06-2011 10:48 1698700

Цитата:

Цитата Hector
как только в ней появится любой файл, выдать сообщение »

Код:

:loop
ping -w 300000 192.0.2.0 -n 1 >nul
dir/b/a-d "D:\aaa\*">nul 2>&1 || goto:loop
msg * Появились новые файлы!
goto:loop


Hector 21-06-2011 11:40 1698742

Хорошо, вот только после сообщения о новых файлах система зависает

amel27 21-06-2011 11:54 1698752

Цитата:

Цитата Hector
после сообщения о новых файлах система зависает »

не сталкивался чтобы MSG подвешивала систему

Hector 21-06-2011 12:05 1698759

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

amel27 21-06-2011 12:10 1698769

Цитата:

Цитата Hector
теперь проблема, как перезапускать bat-файл после срабатывания? »

ну вообще-то для этого цикл и стоял, а сразу после метки ожидание 5мин.

Hector 21-06-2011 12:21 1698781

занятно, но так комп зависает

amel27 21-06-2011 12:25 1698784

Цитата:

Цитата Hector
так комп зависает »

надо выянить на какой команде, другой вариант паузы:
Код:

ping 127.0.0.1 -n 5 >nul


Время: 22:07.

Время: 22:07.
© OSzone.net 2001-