Take the 2-minute tour ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

We have a network folder used as a holding area for XML files that were not properly processed. I’ve been asked to design a script that runs every five minutes and checks the folder for any files less than five minutes old. If it finds files less than five minutes old, it moves them into another directory to be processed.

The trick is, we only want it to move the files one time. If they fail a second time, they will be thrown back into that folder and need to remain there to be dealt with later.

The file names each contain a unique time and date stamp as part of the file name. It’s a little convoluted, but the format is:

YYYYMMDDHHmmSSSSS

I was thinking there might be a way for PowerShell to look at the “mm” stamp of the filename and compare it to the current time. If it’s less than five minutes old, it moves it. If it’s greater than five minutes old, it leaves it alone.

Is this possible?

share|improve this question
    
Obtain the filename as a string, look at index 10-11 and compare them. A less error prone approach would be to convert the timestamps to the absolute time of the unix epoch (seconds since 1. jan 1970) and do comparisons by subtracting 300. I wish I had a windows box at hand to give you a more concrete example, but this is certainly possible. –  Ярослав Рахматуллин Oct 26 '12 at 19:53
add comment

1 Answer

Try the following:

Get-ChildItem |
Where-Object {
  [datetime]::ParseExact($_.BaseName, "yyyyMMddHHmmss", $null) -gt (Get-Date).AddMinutes(-5)
} |
Move-Item -Destination C:\Path\to\target_dir

I split the code up to multiple lines for readability, but you can of course turn it into a one-liner, and even shorten it a bit using PowerShell aliases.


Explanation

  • Get-ChildItem returns a list of all files in the current directory. Note: it also returns subdirectories, but this code assumes you only have files in there. The results are piped (|) to the next command.

  • Where-Object loops through the results from the previous command and returns only those that match the specified criteria. $_ represents the current file of each iteration, and the .BaseName property returns the filename sans extension.

  • The [datetime]::ParseExact() function takes a string and a date format and converts it into a datetime object.

  • Get-Date returns the current date and time. The AddMinutes() function deducts 5 minutes from the current time.

  • The files returned by Where-Object, then, are those where the date and time represented in the filename is no more than 5 minutes older than the current time.

  • Finally, Move-Item moves the matching files to the specified directory.

share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.