none
Скрипт проверки времени изменения каталога и создание файла RRS feed

  • Вопрос

  • Доброго времени суток!

    Стоит задача, создать bat файл и поместить его в планировщик заданий Windows, следующего содержания:

    1. Проверка даты изменения определённого каталога (Например C:\Windows)

    2. В том случае если дата изменения данного каталога отличается от текущей даты более чем на 24 часа (сутки), то ничего не происходит . Если же дата изменения совпадает с текущей датой, то на сетевом диске (\\network_share) создаётся файл (timestamp)

    Спасибо!



    • Изменено DarkShoggot 28 марта 2017 г. 16:20
    28 марта 2017 г. 15:03

Ответы

  • forfiles /P C:\ /M IMG* /D 0 /C "cmd /c echo @fname @fdate @ftime > C:\time.txt"

    Для вашего случая:

    for %%i in (%Maska%) do (
    	set X=%%~ti
    	if defined X (if %X:~3,7% EQU %date:~3,7% echo NOT > C:\time.txt)
    )

    • Помечено в качестве ответа DarkShoggot 31 марта 2017 г. 10:53
    29 марта 2017 г. 5:52
    Отвечающий

Все ответы


  • #Какую директорию проверяем
    $directory = "";
    #куда выгружаем файл
    $exportDirectory = "";
    #Имя файла csv
    $exportFile = "test.csv";


    #Проверим что файл существует(в который грузим)
    $exportFileExist = Get-ChildItem $exportDirectory|where {$_.name -eq $exportFile}

    #Если не существует создаем
    if ($exportFileExist -eq $null)
    {
        New-Item -Name $exportFile -Path $exportDirectory
    }

    #Импортируем данные с файла
    $importCsv = Import-Csv $exportDirectory$exportFile -Delimiter ";" -Encoding Default
    #Получаем состояние директории
    $infoDir = Get-Item $directory| select FullName,LastWriteTime

    #Если в файле есть хоть одна запись
    if ($importCsv.Count -ne 0)
    {
    #Возьмем последнюю
    $index = $importCsv.Count - 1
    #Конвертнем в дату последнюю запись
    $lastInFile = [datetime]::Parse($importCsv[$index].LastWriteTime)
            #Если дата изминения у директории больше или равна последняя  запись в файле +24 часа
        if ($infoDir.LastWriteTime -gt $lastInFile.AddHours(24))
        {
            #Добавим новую запись в файл
            $infoDir|Export-Csv $exportDirectory$exportFile  -Delimiter ";" -Encoding Default -Append
        }

    }
    #Если в файле нет записей, запишем дату изминения директории
    else
    {
    $infoDir|Export-Csv $exportDirectory$exportFile  -Delimiter ";" -Encoding Default -Append
    }

    Мне кажется проще будет в powershele, затолкать в шудулер не тяжелее чем бат.  

    Как то так



    • Изменено Daniil Sedov 28 марта 2017 г. 17:45
    28 марта 2017 г. 16:53
  • Нужно сформировать именно bat-файл.

    Сумел сделать следующее

     

    @echo off
    setlocal

    for %%i in ("C:\test") do set X=%%~ti

    if defined X if %X:~3,7% EQU %date:~3,7% NOT > C:\time.txt

    endlocal
    exit/b 0

    Проблема в том что данный скрипт сравнивает дату создания директории, а не дату её изменения.

    28 марта 2017 г. 18:01
  • forfiles /P C:\ /D 0 /C "cmd /c if @fname == 0x22Windows0x22 echo @fdate @ftime > С:\time.txt"

    или

    forfiles /P C:\ /M Windows /D 0 /C "cmd /c echo @fdate @ftime > С:\time.txt"



    • Изменено KazunEditor 28 марта 2017 г. 18:20
    28 марта 2017 г. 18:14
    Отвечающий
  • Спасибо большое!

    Ещё вопрос

    @echo off
    Set Maska="C:\IMG*"
    for %%i in (%Maska%) do set X=%%~ti
    if defined X if %X:~3,7% EQU %date:~3,7% NOT > C:\time.txt

    endlocal
    exit/b 0

    Скрипт служит для поиска файлов в определённой директории по маске и в том случае если в данной директории имеется файл (совпадающий по маске) дата изменения которого совпадает с текущей, то создаётся файл (time.txt)/

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

    По-возможности подскажите в чём проблема.

    Заранее спасибо.

    28 марта 2017 г. 21:00
  • forfiles /P C:\ /M IMG* /D 0 /C "cmd /c echo @fname @fdate @ftime > C:\time.txt"

    Для вашего случая:

    for %%i in (%Maska%) do (
    	set X=%%~ti
    	if defined X (if %X:~3,7% EQU %date:~3,7% echo NOT > C:\time.txt)
    )

    • Помечено в качестве ответа DarkShoggot 31 марта 2017 г. 10:53
    29 марта 2017 г. 5:52
    Отвечающий
  • Прошу прощения за "непонятливость", но только начал изучать данную тему.

    Ваш вариант не работает, приведу полный текст скрипта, возможно я где-то ошибся

    @echo off

    Set Maska="C:\Users\user\Desktop\12\12*"
    for %%i in (%Maska%) do (
    set X=%%~ti
    if defined X (if %X:~3,7% EQU %date:~3,7% echo NOT > C:\Users\user\Desktop\time.txt)
    )
    endlocal
    exit/b 0

    P.S. Требуется организовать поиск файлов в папке, часть имени файлов совпадает, и в том случае если имеется файл с датой создания совпадающей с текущей, то создать в определённой директории файл (например time.txt) , если же в директории в которой ведётся поиск файл с требуемой датой создания отсутствует, то никаких действий не выполнять.

    29 марта 2017 г. 8:00
  • Все работает, проверил:

    C:\Users\User\Desktop\12>dir
     Том в устройстве C не имеет метки.
     Серийный номер тома: DE18-9561
    
     Содержимое папки C:\Users\User\Desktop\12
    
    29.03.2017  11:09    <DIR>          .
    29.03.2017  11:09    <DIR>          ..
    29.03.2017  11:09                 4 123456.txt
                   1 файлов              4 байт
                   2 папок  21 024 387 072 байт свободно
    			   
    C:\Users\User\Desktop>dir time.txt
     Том в устройстве C не имеет метки.
     Серийный номер тома: DE18-9561
    
     Содержимое папки C:\Users\User\Desktop
    
    Файл не найден
    
    C:\Users\User\Desktop>type 1.bat
    @echo off
    
    Set Maska="C:\Users\user\Desktop\12\12*"
    for %%i in (%Maska%) do (
    set X=%%~ti
    if defined X (if %X:~3,7% EQU %date:~3,7% echo NOT > C:\Users\user\Desktop\time.txt)
    )
    
    C:\Users\User\Desktop>dir time.txt
     Том в устройстве C не имеет метки.
     Серийный номер тома: DE18-9561
    
     Содержимое папки C:\Users\User\Desktop
    
    29.03.2017  11:14                 6 time.txt
                   1 файлов              6 байт
                   0 папок  21 024 186 368 байт свободно

    29 марта 2017 г. 8:15
    Отвечающий
  • 1. В том случае если использовать вариант 

    @echo off
    setlocal
    
    Set Maska="C:\Users\user\Desktop\12\12*"
    for %%i in (%Maska%) do set X=%%~ti
    if defined X (if %X:~3,7% EQU %date:~3,7% echo NOT > C:\Users\user\Desktop\time.txt)
    
    endlocal
    exit/b 0

    Файл "time.txt" создаётся в том случае если в директории "C:\Users\user\Desktop\12" находятся файлы совпадающие по маске с искомыми, не зависимо от даты их создания (то есть проверка соответствия даты текущей - не работает)

    в случае отсутствия в директории файлов совпадающих по маске с искомыми - файл "time.txt" не создаётся, как и должно быть.

    То есть не работает следующая часть:

    (if %X:~3,7% EQU %date:~3,7%

    2. При использовании следующего варианта

    Set Maska="C:\Users\user\Desktop\12\12*"
    for %%i in (%Maska%) do (
    set X=%%~ti
    if defined X (if %X:~3,7% EQU %date:~3,7% echo NOT > C:\Users\user\Desktop\time.txt)
    )

    Файл "time.txt" не создаётся в требуемой директории не зависимо от наличия файлов совпадающих по маске с искомым.

    Различие между двумя вариантами заключается в наличии скобок 

    do ( ... )

    29 марта 2017 г. 10:35
  • Скрин из консоли выполнения скрипта.
    29 марта 2017 г. 10:38
    Отвечающий