Checking Time Variance on multiple files

This topic contains 0 replies, has 1 voice, and was last updated by  Forums Archives 5 years, 11 months ago.

  • Author
    Posts
  • #5270

    by Lahru at 2012-11-12 12:15:54

    I have process in place in my network where files are moved from 1 directory to another via script(s).
    Then there is a service that looks at that other directory and imports either .pdf, .tif, or .jpg files into a program.
    This process of importing occurs once per minute during a specified period of time, something like 16 hours.
    Once the files are successfully imported they are auto-removed from this "IMPORT" directory

    Sometimes the service hangs or otherwise fails to complete an import, but remains in a 'running' state.

    If I can check the LastWriteTime of the files in the "import" directory and compare to the current system time I can launch an email at admins notifying them that something is wrong, IF the variance is outside of a specified time frame.

    Problem is] Multiple files. There are sometimes multiple files being dealt with so I might have 2 or more PDFs that got moved into here, but the service didn't do the actual import and as a result they might remain behind. Also, the name of the file(s) will never be the same.

    Is there a way for me to handle multiple files like this?
    Multiple file Types as well? Like pdf &/OR jpg?

    I have tried the following, but to no avail:
    $dir = "\\Some\path"
    $pdf = Get-ChildItem $dir\*.pdf
    $Variance = ((Get-Date) - $pdf.LastWriteTime).TotalMinutes

    I tried to work this out by entering each line of code 1×1 into a console, but got this on the last:
    Cannot find an overload for "op_Subtraction" and the argument count: "2".
    At line:1 char:1
    + $Variance = ((Get-Date) - $tif.LastWriteTime).TotalMinutes

    by MattG at 2012-11-12 15:35:26

    You need to iterate over each file returned. The following should do the trick for you:
    $pdfs = Get-ChildItem "C:\Some\Path\" -Recurse -Include '*.pdf'
    foreach ($pdf in $pdfs) { ((Get-Date) - $pdf.LastWriteTime).TotalMinutes }
    That should get you going.

    by Lahru at 2012-11-13 08:53:04

    Ok so I can see how that works. It doesn't need to be recursive since files in the subfolders shouldn't trigger any action.
    I need to include some kind of If-Else statement though. I also need to include more than one type of file. Can I do 2 foreach loops? Like so]$dir = \\Some\Path
    $pdfs = Get-ChildItem $dir -Include *.pdf
    $tifs = Get-ChildItem $dir -Include *.tif

    foreach ($pdf in $pdfs) { ((Get-Date) – $pdf.LastWriteTime).TotalMinutes }
    foreach ($tif in $tifs) { ((Get-Date) – $tif.LastWriteTime).TotalMinutes }[/powershell]Here is the Logic I am trying to follow$path = \\some\path
    $pdfs = Get-ChildItem $dir -Include *.pdf
    $tifs = Get-ChildItem $dir -Include *.tif
    $TimeFrame = 2

    foreach ($pdf in $pdfs) { ((Get-Date) - $pdf.LastWriteTime).TotalMinutes }
    If 'Time variance for any Pdf is -gt $TimeFrame {do something} else {do nothing}'

    foreach ($tif in $tifs) { ((Get-Date) - $tif.LastWriteTime).TotalMinutes }
    If 'Time variance for any Tif is -gt $TimeFrame {do something} else {do nothing}'
    I hope that makes sense. How do I work in the if statements?

    by MattG at 2012-11-13 09:05:20

    No need to do that twice. The -Include option takes an array of strings (check out Get-Help Get-ChildItem). The following will handle both pdf and tif files:
    $path = \\some\path\*
    $files = Get-ChildItem $path -Include '*.pdf','*.tif'
    $TimeFrame = 2

    foreach ($file in $files) { ((Get-Date) - $file.LastWriteTime).TotalMinutes }Also, I would have Get-ChildItem only return files:

    v2 Syntax: Get-ChildItem $path -Include '*.pdf','*.tif' | ? { ! $_.PSIsContainer }v3 Syntax: Get-ChildItem $path -Include '*.pdf','*.tif' -File

    by Lahru at 2012-11-13 09:25:37

    DOH! Should have seen that.
    What about the IF portion(s)?

    by Lahru at 2012-11-13 11:18:42

    Does this look right?$dir = "\\Some\Path"
    $TimeFrame = 2
    $files = Get-ChildItem $dir -Include '*.pdf', '*.tif' | ? { ! $_.PSIsContainer }

    foreach ($file in $files)
    {
    if (((Get-Date) - $file.LastWriteTime).TotalMinutes -gt $TimeFrame)
    { Send-MailMessage -From Sender@Somewhere.net -To "Recipient " -Subject "Subject" -Body "Body of the email message" -SmtpServer ThisSmtpServer.Somewhere.net } }

You must be logged in to reply to this topic.