none
Помогите с написанием скрипта. Или логики скрипта. RRS feed

  • Вопрос

  • Вообщем есть папка ,в которую сыпятся файлы со случайным именем. Нужно отслеживать один случайный фаил по времени его нахождения в этой папке. То есть если фаил находится в этой папке более 30 минут то выполнить какое нить условие , например создать фаил в другой папке... не могу понять как это реализовать... надеюсь на вас.
    22 июня 2015 г. 6:49

Ответы

  • На вот это получите ошибку

     { "$_" > C:\error\erros.txt}}

    + как я писал ранее лучше использовать нижний скрипт, так как он не требует доработки

    Если вы хотите вывести все файлы которые существуют более 15 минут

    Get-ChildItem "C:\temp" -file | foreach {
        if ($($_.CreationTime).AddMinutes(15) -lt $(Get-Date)){
            "$($_.Name)" | Out-file c:\error\error.txt -append
        }
    }

    • Помечено в качестве ответа butunin 22 июня 2015 г. 12:17
    22 июня 2015 г. 12:09
    Модератор
  • У вас в в файл будут попадать только файлы которые провалялись в папке более 15 минут

    Насколько я понимаю из вашего вопроса они все должны быть с номером 2

    В строке

    "$($_.Name)" 

    вы можете формировать любой метод вывода, например:

    "$(Get-date -format d): Code:2 Filename - $($_.Name)" 

    • Помечено в качестве ответа butunin 22 июня 2015 г. 13:56
    22 июня 2015 г. 13:44
    Модератор

Все ответы

  • Файлы в папке появляются и исчезают?

    Если условие по времени то вы можете привязаться ко времени создания (изменения файла)

    if (($DateTimeNow - $DateTimeCriate) -gt 30){"Do somthing"}

    22 июня 2015 г. 7:10
    Модератор
  • Ага ... это понятно ... а как выбрать случайный фаил из папки... вообщем опишу ситуацию более подробно.
    Есть папка в нее сыпятся xml файлы , имя файлов там случайное и не повторяется, папка очищается каждые 15минут (парсер есть) , иногда этот парсер не срабатывает, так вот логика у меня какая.
    Взять случайный фаил в этой папке , запомнить его им и время создания, обратиться в эту папку через 20 минут , если фаил это имеется и находится в этой папке более 15 минут - то сделать ченить ... 
    22 июня 2015 г. 8:51
  • ждать по 20 - 30 минут не лучшая практика (можно но выглядеть будет вроде скрипт висит)

    лучше шедулером запускать скрипт раз в какое-то время и проверять все дочерние файлы на разность во времени

    Например вы запускаете скрипт раз в 10 минут и проверяете все файлы на предмет того когда они созданы

    Если созданы менее 15 минут назад то можете прикрутить одно действие если более 15 другое...

    22 июня 2015 г. 8:58
    Модератор
  • Считаю вашу идею очень хорошей, теперь как нить это в программном коде реализовать ;) Если у вас есть какие -то наработки? 
    22 июня 2015 г. 9:02
  • Только нужно формат даты выбрать правильный

    Get-ChildItem "C:\temp" -file | foreach {
        if (($(Get-Date) - $($_.CreationTime)) -gt 30){
            $delay = (($(Get-Date) - $($_.CreationTime)))
            "$($_.Name) $delay"
        }
    }

    или в сравнении сделать что то типа такого

    Get-ChildItem "C:\temp" -file | foreach {
        if ($($_.CreationTime).AddMinutes(15) -lt $(Get-Date)){
            "$($_.Name)"
        }
    }

    22 июня 2015 г. 9:12
    Модератор
  • Хмм... интересно , а если как взять случайный фаил ... я тут вот накалякал ... поправьте меня ...
    Get-ChildItem C:\logs\*.xml | Get-Random | Foreach {Start-Sleep -Seconds 600; try { Get-Item $_.FullName -ErrorAction Stop} catch { "$_" > C:\error\erros.txt}}

    22 июня 2015 г. 9:14
  • Хмм... интересно , а если как взять случайный фаил ... я тут вот накалякал ... поправьте меня ...
    Get-ChildItem C:\logs\*.xml | Get-Random | Foreach {Start-Sleep -Seconds 600; try { Get-Item $_.FullName -ErrorAction Stop} catch { "$_" > C:\error\erros.txt}}

    А зачем брать произвольный файл?

    Get-Random

    выдает один файл из списка

    Он то произвольный но один

    Get-Item $_.FullName -ErrorAction Stop
    резона не имеет так как вы получите то же самое что вам отдаст
    Get-ChildItem


    22 июня 2015 г. 9:26
    Модератор
  • Ну я тут подумал, что например файлы туда падают регулярно, и я подумал что мне нужна точка отсчета времени относительно чего-то ... например взять один случайны фаил его уже сравнивать , если парсер не отработал этот фаил в течении 10 минут то это точно уже проблема ... 
    Или вам кажется что это не совсем разумно? накидайте тезизы если не сложно мне интересно поискать слабые стороны и проблемы в логике.
    Опишу софтину ...

    Вообще есть робот который кладет в папку файлы он кладет регулярно ну там каждую секунду или максимум раз в 5 минут ... это понятно ... теперь есть другой робот который забирает из этой папке эти файлы ... если файлы не забрались в течении 10 минут - это проблема ее надо отследить. 
    22 июня 2015 г. 9:36
  • Слабые места вашего метода:

    Исходные данные папка в которой например 100 файлов

    Часть этих файлов удаляются, часть добавляются но число допустим 100 файлов (приблизительно)

    Имеем 1 проблемный файл, какова вероятность что вы на него попадете использую командлет

    Get-Random

    Ответ: 1 к 99 - не велика вероятность

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

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


    готовые наработки я набросал (мне больше нравиться нижний но можно допилить и верхний)
    22 июня 2015 г. 10:01
    Модератор
  • Интересная мысль ... в верхний скрипт берет даты создания последнее файла ... тогда мы не может гарантировать что это будет 1 из 100 .. это может быть и 2 из 100 ... ведь скрипт будет брать только последние созданные файлы я верно понимаю? 
    22 июня 2015 г. 11:00
  • Не правильно

    Get-ChildItem "C:\temp" -file | foreach {...

    Получить все файлы в каталоге | для каждого из полученых выполнить действие {...}

    В этом плане и 1й и второй вариант идентичны

    Мы перебираем все файлы по очереди и в случае если условие выполняется делаем какое-то действие

    Разница лишь в проверке условия

    22 июня 2015 г. 11:11
    Модератор
  • То есть окончательный будет примерно такой ?
    Get-ChildItem "C:\temp" -file | foreach {
        if (($(Get-Date) - $($_.CreationTime)) -gt 30){
            $delay = (($(Get-Date) - $($_.CreationTime)))
            "$($_.Name) $delay"
        }
    } { "$_" > C:\error\erros.txt}}
    

    22 июня 2015 г. 12:02
  • На вот это получите ошибку

     { "$_" > C:\error\erros.txt}}

    + как я писал ранее лучше использовать нижний скрипт, так как он не требует доработки

    Если вы хотите вывести все файлы которые существуют более 15 минут

    Get-ChildItem "C:\temp" -file | foreach {
        if ($($_.CreationTime).AddMinutes(15) -lt $(Get-Date)){
            "$($_.Name)" | Out-file c:\error\error.txt -append
        }
    }

    • Помечено в качестве ответа butunin 22 июня 2015 г. 12:17
    22 июня 2015 г. 12:09
    Модератор
  • Больше вам спасибо!
    22 июня 2015 г. 12:17
  • Коль пошла такая пьянка ... как мне еще выводить в код завершения ... если фаил найден то код 1 если нет то код 2?
    22 июня 2015 г. 13:30
  • У вас в в файл будут попадать только файлы которые провалялись в папке более 15 минут

    Насколько я понимаю из вашего вопроса они все должны быть с номером 2

    В строке

    "$($_.Name)" 

    вы можете формировать любой метод вывода, например:

    "$(Get-date -format d): Code:2 Filename - $($_.Name)" 

    • Помечено в качестве ответа butunin 22 июня 2015 г. 13:56
    22 июня 2015 г. 13:44
    Модератор