Months ago, I started writing a list of ways to potentially impress PowerShell newbies for a presentation (I’ve yet to ever give). Since I’m not sure if I’ll be up in front of a crowd of PSNewbies any time soon, I figured I would share them here. Consider these when you need to impress the PowerShell non-believers.
Part I
The power in PowerShell has been said to be a number of different things, by a number of different people. In today’s topic, the power is speed and accuracy. We’re going to automate the creation of 10,000 directories (a.k.a. folders). That’s no small task if you’re doing it manually.
Beginning in the example below, we’ll start by creating a single directory to hold the other 10,000 directories, by running a New-Item command. Once that’s finished, which is practically instantaneous, we’ll run second command to create the 10,000 new folders. We’ll do this by using a range operator (..) and the numbers 1 and 10000, piping each of those numbers and the ones in between, to that second New-Item command.
Notice the $_ variable, as this has the tendency to cause some confusion. This variable holds the value of the current object that’s entered, or crossed, the pipeline — you pick your visual. In this case, it represents the current number from within our range of numbers. The first time this command runs, $_ will be set to 1, the second time this runs it will be set to 2, and the last time it runs, it will be set to 10000. I should note, that in PowerShell 3.0, the $PSItem variable was introduced. It can be used in place of $_ in version 3.0 and above.
PS> New-Item -Path C:\Testing -ItemType Directory Directory: C:\ Mode LastWriteTime Length Name ---- ------------- ------ ---- d---- 1/6/2016 9:52 PM Testing PS> 1..10000 | ForEach-Object {New-Item -Path "C:\Testing\$_" -ItemType Directory} Directory: C:\Testing Mode LastWriteTime Length Name ---- ------------- ------ ---- d---- 1/6/2016 9:52 PM 1 d---- 1/6/2016 9:52 PM 2 d---- 1/6/2016 9:52 PM 3 d---- 1/6/2016 9:52 PM 4 d---- 1/6/2016 9:52 PM 5 d---- 1/6/2016 9:52 PM 6 d---- 1/6/2016 9:52 PM 7 d---- 1/6/2016 9:52 PM 8 d---- 1/6/2016 9:52 PM 9 d---- 1/6/2016 9:52 PM 10 ...
I haven’t included all 10,000 results, for good reason, but as you can see, the moment the command was entered into the PowerShell host, it began to create the new folders. This would be the time at which you retie your shoes. The example further below indicates the command takes about 10 seconds to complete. Depending on your sneakers, if you’re wearing those, you might actually take longer. If you don’t have laces, take a drink of something, or simply sit there in amazement at all the work you’re not really doing. It might actually be too fast, once you’ve realized how much time you just freed up.
A little note about Measure-Command used below: Typically this cmdlet will internally measure things and not really do much that you can actually see. In this case, it’s actually going to create the folders as part of the measurement. To me, it makes sense that it wouldn’t be able to measure this unless it really creates the folders. On that note, if you ran the command above, you’ll want to delete the existing folders, if you want to measure how long it takes to create the folders. The New-Item cmdlet can’t create folders that already exist. To remove the directories, run:Â Remove-Item -Path ‘C:\Testing\*’ from your PowerShell console.
PS> Measure-Command -Expression {1..10000 | ForEach-Object {New-Item -Path "C:\Testing\$_" -ItemType Directory}} Days : 0 Hours : 0 Minutes : 0 Seconds : 10 Milliseconds : 293 Ticks : 102939103 TotalDays : 0.000119142480324074 TotalHours : 0.00285941952777778 TotalMinutes : 0.171565171666667 TotalSeconds : 10.2939103 TotalMilliseconds : 10293.9103 PS> Remove-Item -Path C:\Testing\* Days : 0 Hours : 0 Minutes : 0 Seconds : 9 Milliseconds : 793 Ticks : 97934962 TotalDays : 0.000113350650462963 TotalHours : 0.00272041561111111 TotalMinutes : 0.163224936666667 TotalSeconds : 9.7934962 TotalMilliseconds : 9793.4962
In the second command above, we actually measured the time it took to remove the directories we created — you saw that command a moment ago. It came in at a faster time than it took to create them, although this won’t always be the case. It’s still quite quick for either operation.
This is a great example of the power in PowerShell, but before I wrap up, let’s see how much time I just saved. Let’s assume it takes me 4 seconds to manually create a folder. To create 10,000 folders, I would need a free 40,000 seconds. To put that into hours, I would need over 11 of them to do this task by hand. We only get one person’s salary, but we should probably get a few.
PS> $SecondsToCreateFolder = 4 PS> $NumberOfFolderToCreate = 10000 PS> $NumberOfFolderToCreate * $SecondsToCreateFolder 40000 PS> $SecondsInMinutes = $MinutesInHours = 60 PS> $SecondsInMinutes 60 PS> $MinutesInHours 60 PS> ($NumberOfFolderToCreate * $SecondsToCreateFolder) / $SecondsInMinutes / $MinutesInHours 11.1111111111111
Thanks for reading this post.