Command-line shortcut for repetitive operations

There are times when you might want to do the same thing many times at the command line.  You normally would use a counted for loop:

MSH:19 C:\temp\monad > for($x = 0; $x -lt 5; $x++) { do-something }

But here’s a neat little trick to save some typing, if you don’t care which iteration of the loop you’re in:

MSH:19 C:\temp\monad > 1..5 | foreach { do-something }

This is a bloated and slow way to do a for loop, though, so don’t use it in scripts.

The 1..5 expression creates an array of 5 elements, using the numbers 1 through 5.  Then, we pipe it to foreach-object — which then performs “do-something” for each element in the array.

For more neat things you can do with arrays, type 
   get-help about_Array
at your prompt.

[Edit: Monad has now been renamed to Windows PowerShell. This script or discussion may require slight adjustments before it applies directly to newer builds.]

3 Responses to “Command-line shortcut for repetitive operations”

  1. Clifford Caoile writes:

    Could you explain why "This is a bloated and slow way to do a for loop" because the Hankatsu person seems to think that there is no drawback (or fast).

  2. Clifford Caoile writes:

    I meant to add the URL for reference:

  3. Lee Holmes writes:

    Sorry, Clifford — I still can’t read what Hankatsu wrote. He or she quoted this post, then expanded it a little bit to make a cool download script.

    The reason that this is bloated and slow is that the "1..5" expression actually creates an array of 5 numbers, then passes it down the pipeline. Next, the foreach does one thing for each number in the array.

    You can see the efficiency differences with time-expression:

    MSH:2 C:\Temp >time-expression { 1..10000 | foreach {} }
    TotalMilliseconds : 1078.125

    MSH:3 C:\Temp >time-expression { foreach ($x in 1..10000) {} }
    TotalMilliseconds : 15.625

    One important thing to remember about performance optimizations, though, is that they can always change under you. It is possible for us to make the "bloated and slow" version nearly as fast as the second version, but it probably won’t reduce its memory consumption.

    Also, with all development — it’s best to program to your intention, not to side-effects. On the command-line, take all of the typing short cuts you want. In a script, though, non-intuitive shortcuts often make your script difficult to read and error prone.


Leave a Reply