Проверка существования файла
Задача вот в чем:
имеется следующая структура D:\data\xxxx\mmdd\ и F:\data\xxxx\mmdd\
где xxxx - различные папки с различными именами соответственно (около 20 штук) mmdd - папки, имена которых состоят из месяца (mm) и даты (dd) в этих папках необходимо проверить существование файла, допустим filename.vvv и при наличии такового записать в лог, что все хорошо, а при его отсутствии - все плохо.
перерыл справку по командной строке, перелопалил кучу форумов уже голова пухнет от всего...
Пожалуйста, направите в нужное русло...
|
Ничего дельного не скажу. Но. В 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 |
Пожалуй так, действительно, зачем прогонять все имена файлов в цикле - если нужно проверить заранее известный
|
Спасибо ребята огромное! Почти то, что надо! Дальше думаю уже до разберусь. "Пинок" в нужном направлении получен и это главное :)
|
В общем то все работает, и практически как надо, но есть небольшое "но"
в лог включаются папки с прошлыми датами, а этого как бы и не надо...
Имеется следующий код:
Код:
@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]"')
Не проверял, сразу в пост пишу. Обрати внимание на формат дат в папке - может у тебя по другому.
|
SendMessage, СПАСИБО тебе ОГРОМНОЕ!
наконец то до меня дошло как регулярные выражения задаются :)...
|
В PowerShell проверка существования файла одной строкой:
Код:
Test-Path "C:\test.txt"
Если файл C:\test.txt есть, то результат True, если нет, то False.
|
Время: 19:17.
© OSzone.net 2001-