Learn about Windows PowerShell
Summary: Microsoft Scripting Guy, Ed Wilson, talks about using Windows PowerShell to create a bunch of folders based upon the date.
Microsoft Scripting Guy, Ed Wilson, is here. Well, this morning I took the Scripting Wife to the Charlotte airport to begin our trip to Europe. It is beyond me why Teresa must fly nearly 1,200 miles in the opposite direction—to Dallas, Texas—before she gets on another air plane, and then flies 1,200 miles back towards Charlotte, North Carolina, on her way to Frankfurt, Germany. Anyway, I leave this evening and will meet her at the train station at the Frankfurt airport. Tomorrow, we will be in Dortmund, Germany, and will have dinner with the past winner of the Scripting Games Klaus Shulte. We are looking forward to that.
Anyway, Teresa was adamant—create a bunch of folders on our external USB 3 “indestructible” hard drive. Each folder should be based upon the date. In this way, when it is late at night, I will not just “dump” 128 GB of pictures in the root folder and call it a day (or a night). I guess she knows how I am—I love taking pictures and I hate organizing pictures.
The first thing I need to do is to figure out how many folders to create. I could count, but dude … that is sooooo last century. Instead, I decided to use New-TimeSpan because I know when I leave— today—and when we return. Here is the code I ran along with the associated output.
PS C:\> New-TimeSpan -Start (get-date) -End 12/3/12
Days : 19 Hours : 11 Minutes : 24 Seconds : 59 Milliseconds : 191 Ticks : 16826991917033 TotalDays : 19.4756850891586 TotalHours : 467.416442139806 TotalMinutes : 28044.9865283883 TotalSeconds : 1682699.1917033 TotalMilliseconds : 1682699191.7033
All I need to do is to create 19 folders based upon dates in the future. So this means a little repetition, which means I will use the Foreach-Object cmdlet. I can get the dates by using the adddays method, and there is a tostring method that turns the datetime object into a string. I can also specify the type of string to create. Here is the code I came up with to create the names (later I will add the code to create the folders). (I do not need a folder for today, so I begin at 1. Also, we fly home on December 3rd, but we are coming by train back from Prague, so we will need a folder for the December 3rd. So, I add one number there and end at 20 instead of 19.
PS C:\> 1..20 | % {(get-date).adddays($_).tostring("MMddyyyy")} 11142012 11152012 11162012 11172012 11182012 11192012 11202012 11212012 11222012 11232012 11242012 11252012 11262012 11272012 11282012 11292012 11302012 12012012 12022012 12032012
Now, I need to create the folders on my portable USB drive. It is drive F (I set it in computer management and treat it as if it were a fixed disk). Instead of just creating folder names, this time, I add the New-Item cmdlet. The name is obvious and the type is a directory. Because I changed my working drive to the F drive, I do not need to worry about a path. I use PushD to store the current location, and then I use Set-Location to change to the F drive. Next, I create the folders and, finally, I return to my working drive via popd. The commands is shown here.
pushd sl f:
1..20 | % {New-Item -Name (get-date).adddays($_).tostring("MMddyyyy") -ItemType directory}
popd
Well, that is it. I need to finish packing so I can join Teresa in Frankfurt tomorrow. Until then, take care, and happy scripting.
I invite you to follow me on Twitter and Facebook. If you have any questions, send email to me at scripter@microsoft.com, or post your questions on the Official Scripting Guys Forum. See you tomorrow. Until then, peace.
Ed Wilson, Microsoft Scripting Guy
Hey, everyone! Greetings from Redmond.
As an compulsive organizer of pictures by date, I speak from past pain. I'd recommend that you instead use the .tostring mask "yyyy-MM-dd" instead, so that they sort correctly, and is also a bit more readable. You're more likely to want to see all the 2011 folders together then the 2012 folders, instead of seeing all the Novembers together then all the Decembers.
Happy Scripting!
Dave Bishop
The Scripting Manager
@Scripting Manager, this is a very good point. This will be my first time creating a bunch of folders to store my pictures within ... and your approach will be better. Thank you for sharing.