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

vilSK 08-02-2011 17:39 1607737

Проверка существования файла
 
Задача вот в чем:
имеется следующая структура D:\data\xxxx\mmdd\ и F:\data\xxxx\mmdd\
где
xxxx - различные папки с различными именами соответственно (около 20 штук)
mmdd - папки, имена которых состоят из месяца (mm) и даты (dd)
в этих папках необходимо проверить существование файла, допустим filename.vvv и при наличии такового записать в лог, что все хорошо, а при его отсутствии - все плохо.

перерыл справку по командной строке, перелопалил кучу форумов уже голова пухнет от всего...
Пожалуйста, направите в нужное русло...

Spooner 08-02-2011 21:43 1607940

Ничего дельного не скажу. Но. В cmd, наверное, как-то и можно, только не представляю как. Но по-моему, проще в powershell. Он легко может получить список папок в массив. Это как раз то, чего, как мне кажется, не умеет cmd, и что здесь необходимо для навигации по папкам и проверки существования файла. Или умеет, но ректально.
Далее всё должно быть очень просто. Не ленись, возьмись за изучение powershell. Результаты оправдаются. Сам ленился сначала.

Ivan Bardeen 08-02-2011 23:19 1608008

Цитата:

Цитата vilSK
Пожалуйста, направите в нужное русло... »

Вот вам скрипт на vbs, который решает вашу задачу - и пишет в лог c:\temp\log.txt
Код:

Const ForAppending = 8
i=0

Set FSO = CreateObject("Scripting.FileSystemObject")
Set objFile = FSO.CreateTextFile("C:\temp\Log.txt", ForAppending, TRUE)


ShowSubFolders FSO.GetFolder("D:\data")
ShowSubFolders FSO.GetFolder("F:\data")

Sub ShowSubFolders(Folder)
    For Each Subfolder in Folder.SubFolders
        objFile.WriteLine "Для папки:" & Subfolder.path
                For Each file In Subfolder.files
                If file.name = "filename.vvv" Then
                objFile.WriteLine "Все хорошо!"
                i=1
                Exit For
                End If
                Next
                If i =0 Then
                          objFile.WriteLine "Все плохо!"
                End If
                i=0
        ShowSubFolders Subfolder
    Next
End Sub


SendMessage 09-02-2011 05:41 1608126

Батником самый экономный:
Код:

@echo off
dir /b/a-d/s "D:\data\filename.vvv" "F:\data\filename.vvv" && echo Good! > log.txt || echo Bad! > log.txt

Цитата:

Цитата Spooner
Или умеет, но ректально. »

Ай-яй-яй! Как не стыдно? :)
Вполне себе орально умеет.

SendMessage 09-02-2011 09:12 1608197

Сейчас подумал - наверное, надо в каждой папке чтобы был файл.
Тогда так:
Код:

@echo off
for /f "tokens=*" %%a in ('dir /b/ad/s "D:\data" "F:\data"') do (
  if /i exist %%a\filename.vvv (
      echo в папке %%a - файл есть >> log.txt
      ) else (
      echo в папке %%a - файлa нет >> log.txt
  )
)

Ivan Bardeen, а вот этот цикл не лишний?
Код:

For Each file In Subfolder.files
  If file.name = "filename.vvv" Then
    objFile.WriteLine "Все хорошо!"
    i=1
    Exit For
  End If
Next

Так?
Код:

For Each Subfolder in Folder.SubFolders
  objFile.WriteLine "Для папки:" & Subfolder.path
  If FSO.FileExists(Subfolder.Path & "\filename.vvv") Then
    objFile.WriteLine "Все хорошо!"
  Else
    objFile.WriteLine "Все плохо!"
  End If
  ShowSubFolders Subfolder
Next


Ivan Bardeen 09-02-2011 09:17 1608201

Цитата:

Цитата SendMessage
Так? »

Пожалуй так, действительно, зачем прогонять все имена файлов в цикле - если нужно проверить заранее известный

vilSK 09-02-2011 10:03 1608246

Спасибо ребята огромное! Почти то, что надо! Дальше думаю уже до разберусь. "Пинок" в нужном направлении получен и это главное :)

vilSK 10-02-2011 11:06 1609137

В общем то все работает, и практически как надо, но есть небольшое "но"
в лог включаются папки с прошлыми датами, а этого как бы и не надо...
Имеется следующий код:
Код:

@echo off

setlocal

set _fn=*%date:~-4%%date:~3,2%%date:~0,2%*.avi
set _log=video_surve.log
set _errlog=video_surve_error.log
set _i=0
set smtp=192.168.200.2
set from=xxxx@xxxx.ru
set to1=xxxx@xxxx.ru
set to2=xxxx@xxxx.ru
set mess=VideoServer-%computername%-OK!
set err_mess=VideoServer-%computername%-ERROR!

if exist %_log% del %_log%
if exist %_errlog% del %_errlog%

echo Дата: %date% Время: %time% Сервер: %computername% >> %_log%
echo. >> %_log%

echo Дата: %date% Время: %time% Сервер: %computername% >> %_errlog%
echo. >> %_errlog%

for /f "tokens=*" %%a in ('dir /b/ad/s "D:\videodata\" "F:\videodata\"') do (
  if /i exist %%a\%_fn% (
      echo в папке %%a - есть следующие файлы: >> %_log%
      dir /b %%a >> %_log%
      set /a _i=%_i%+1
      ) else (
      echo в папке %%a - файлов за %date% НЕТ >> %_errlog%
  )
)
if %_i%==0 (
  postie.exe -host:%smtp% -s:%err_mess% -to:%to1% -from:%from% -charset:Windows-1251 -file:%_errlog% -log:log_mail.txt -v
  postie.exe -host:%smtp% -s:%err_mess% -to:%to2% -from:%from% -charset:Windows-1251 -file:%_errlog% -log:log_mail.txt -v
  )
if %_i%==1 (
  postie.exe -host:%smtp% -s:%mess% -to:%to1% -from:%from% -charset:Windows-1251 -file:%_log% -log:log_mail.txt -v
  postie.exe -host:%smtp% -s:%mess% -to:%to2% -from:%from% -charset:Windows-1251 -file:%_log% -log:log_mail.txt -v
  )

endlocal

как вот его можно оптимизировать, чтобы он искал по следующим путям:
D(F):\videodata\camXX\mmdd,
где
XX - цифровое обозначение от 1 и до 99
mmdd - папки, имена которых состоят из месяца (mm) и даты (dd)

SendMessage 10-02-2011 15:00 1609340

Цитата:

Цитата vilSK
как вот его можно оптимизировать, чтобы он искал по следующим путям:
D(F):\videodata\camXX\mmdd,
где
XX - цифровое обозначение от 1 и до 99
mmdd - папки, имена которых состоят из месяца (mm) и даты (dd) »

Ну, наверное, так:
Код:

for /f "tokens=*" %%a in ('dir /b/ad/s "D:\videodata\" "F:\videodata\" ^| findstr /i/e "\\cam[0-9]*\\[0-1][0-9][0-3][0-9]"')
Не проверял, сразу в пост пишу. Обрати внимание на формат дат в папке - может у тебя по другому.

vilSK 10-02-2011 15:26 1609368

SendMessage, СПАСИБО тебе ОГРОМНОЕ!
наконец то до меня дошло как регулярные выражения задаются :)...

Arata 23-05-2013 12:40 2154650

В PowerShell проверка существования файла одной строкой:
Код:

Test-Path "C:\test.txt"
Если файл C:\test.txt есть, то результат True, если нет, то False.


Время: 19:17.

Время: 19:17.
© OSzone.net 2001-