ML
    • Recent
    • Categories
    • Tags
    • Popular
    • Users
    • Groups
    • Register
    • Login

    Understanding $args in PowerShell

    Developer Discussion
    powershell
    7
    92
    70.6k
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • scottalanmillerS
      scottalanmiller
      last edited by

      I doubt that Martin will agree but I don't find PowerShell to be particularly well suited to learning programming concepts. It's a great language for what it is, but I'm very glad that I learned programming on other languages and then learning PowerShell.

      M 1 Reply Last reply Reply Quote 0
      • C
        chutestrate
        last edited by

        I'm not fooling myself. I don't do well with trying to be a programmer. This is part of the testing goals. I just got interested in powershell, and am trying it out. Thank you for all the time. I'm rereading the posts, and I'm going to have a hard time matching $args to arrays. Maybe tomorrow it will click.

        scottalanmillerS 1 Reply Last reply Reply Quote 0
        • scottalanmillerS
          scottalanmiller @chutestrate
          last edited by

          @chutestrate said:

          I'm rereading the posts, and I'm going to have a hard time matching $args to arrays. Maybe tomorrow it will click.

          Just remember that there is nothing to match. $args is just another array like any other. It's not a different thing. It's not "like" an array, or similar to or anything. It is an array. $args is the name of an array. I have a feeling that you are thinking of $args as a thing rather than the name of an array.

          1 Reply Last reply Reply Quote 0
          • C
            chutestrate
            last edited by

            I definitely am. Unfortunately, i don't see it the way you are telling me.

            scottalanmillerS 1 Reply Last reply Reply Quote 0
            • M
              Martin9700 @scottalanmiller
              last edited by

              @scottalanmiller said:

              I doubt that Martin will agree but I don't find PowerShell to be particularly well suited to learning programming concepts. It's a great language for what it is, but I'm very glad that I learned programming on other languages and then learning PowerShell.

              The languages I've mostly worked with are batch/cmd, Visual Basic, vbScript and PowerShell. So PowerShell is a vast improvement over those ๐Ÿ™‚

              It took me awhile to really grasp the idea of objects and using them for everything in PowerShell, but once I did the whole language opened up to me and I began to realize all the things I could do.

              scottalanmillerS 1 Reply Last reply Reply Quote 0
              • C
                chutestrate
                last edited by

                Both of you have been immensely helpful. I hope I can return the favor in some way.

                1 Reply Last reply Reply Quote 0
                • scottalanmillerS
                  scottalanmiller @Martin9700
                  last edited by

                  @Martin9700 said:

                  @scottalanmiller said:

                  I doubt that Martin will agree but I don't find PowerShell to be particularly well suited to learning programming concepts. It's a great language for what it is, but I'm very glad that I learned programming on other languages and then learning PowerShell.

                  The languages I've mostly worked with are batch/cmd, Visual Basic, vbScript and PowerShell. So PowerShell is a vast improvement over those ๐Ÿ™‚

                  It took me awhile to really grasp the idea of objects and using them for everything in PowerShell, but once I did the whole language opened up to me and I began to realize all the things I could do.

                  I come at it from the other direction. Was doing C and Fortran, then Java and C#. Everything is better than Fortran, though.

                  1 Reply Last reply Reply Quote 0
                  • scottalanmillerS
                    scottalanmiller @chutestrate
                    last edited by

                    @chutestrate said:

                    I definitely am. Unfortunately, i don't see it the way you are telling me.

                    If I could figure out how you are perceiving it then maybe I could help more. I'm not sure how you are looking at it, though, which makes it hard for me.

                    1 Reply Last reply Reply Quote 0
                    • C
                      chutestrate
                      last edited by

                      Trying to sort it out. The automation piece is part of it. If it's created automatically why is the programmer designating what $args[0], [1], [2], etc is.

                      scottalanmillerS 1 Reply Last reply Reply Quote 0
                      • scottalanmillerS
                        scottalanmiller @chutestrate
                        last edited by

                        @chutestrate said:

                        Trying to sort it out. The automation piece is part of it. If it's created automatically why is the programmer designating what $args[0], [1], [2], etc is.

                        The programmer is not designating what they are. The programmer is reading the contents out. At no point, in any example, did we specify in our program what the values of the elements in the $args array were. We never did that. All we ever did was print out their contents to show what they had been set to by PowerShell.

                        1 Reply Last reply Reply Quote 0
                        • M
                          Martin9700
                          last edited by

                          Let me take a stab at explaining an array. It's just a list. When you write your groceries on a piece of paper you have a variable with multiple values on it. You don't write a single item per piece of paper, right? If you did that'd be a regular variable. Instead you put the whole list on one piece of paper, making it an array/list.

                          Computers are great with lists, but they have some limitations, and they have to be told to do things in a very literal sense. So, grocery list is:

                          $GroceryList = "beer","wine","whiskey","brandy","vodka","chips"
                          

                          In PowerShell, the comma's are what tell PowerShell that this is an array. Now, if I ask you what's the 3rd item in the list, you would scan through and count each one, until you got to "whiskey". PowerShell is the same way, but we can jump straight to the third item. Try:

                          $GroceryList[3]
                          

                          The brackets with the number tell PowerShell that you want to reference a particular item in the array. The number tells you which item. So we got Whiskey, right? If you tried it, you know we got "brandy". WTF? In programming languages, and this is pretty much universal, arrays always start at zero. So $GrocyerList[0] is beer, $GroceryList[1] is wine, and last $GroceryList[2] is whiskey. So when working with arrays you'd really want to:

                          $GroceryList[2]
                          

                          To have PowerShell return the 3rd element. Each item in an array is called an element, by the way. Looking back at Scott's code, what he was doing was creating a For/Next loop, which is a loop using a number as reference.

                          for ($i = 0; $i -lt $GroceryList.Count; $i ++)
                          

                          Is some goofy looking stuff, but the first part $i = 0 marks our starting point. $i = 0. The next part is a IF statement, that as long as it's true we'll continue the loop. In PowerShell we have built in properties, and one of those is Count which tells us the number of elements in the array. So as long as our $i variable is less then that count, we'll keep looping in the for loop. The last part $i ++ tells the loop, that when I'm done with the loop add one. The ++ thing is basically shorthand for $i = $i + 1.

                          Now PowerShell will continue to run the code contained in the scriptblock (all the code between the curly brackets) until our $i variable equals or is greater than the number of elements in our $GroceryList. So the first time through the loop $i = 0, we display that number, and we reference the element in our array that corresponds with zero. Which is beer. Loop ends, $i increments to 1, start again.

                          Loop displays the number 1, and shows the $GroceryList element that corresponds to that number, which happens to be "wine". Code block ends, $i increments to 2. This is still less the $GroceryList.Count (which is 6, btw) so the loop repeats. Onward until $i get's to 6, at which point it exits the loop and continues on with the script. In this case there is no more script, so it exits the script and drops you back into the shell.

                          1 Reply Last reply Reply Quote 3
                          • C
                            chutestrate
                            last edited by

                            I'm actually following that. But the $args to array thing....

                            This isn't stating that $args is?

                            for ($i=0; $i -lt $args.length; $i++) {
                            "This is `$args[$i], which is: $($args[$i])"
                            }

                            scottalanmillerS 2 Replies Last reply Reply Quote 0
                            • scottalanmillerS
                              scottalanmiller @chutestrate
                              last edited by

                              @chutestrate said:

                              I'm actually following that. But the $args to array thing....

                              Not $args to array. $args is the name of an array that is created at the time that the program is called.

                              1 Reply Last reply Reply Quote 0
                              • scottalanmillerS
                                scottalanmiller @chutestrate
                                last edited by

                                @chutestrate said:

                                This isn't stating that $args is?

                                for ($i=0; $i -lt $args.length; $i++) {
                                "This is `$args[$i], which is: $($args[$i])"
                                }

                                No, never is any value of $args set here. This is a for loop that simply counts from zero to "however long the array is." And it prints out the value of each element of the array one after another.

                                If this was setting the values in the array there would need to be details in this like the names or whatever, but none of that is here. This is just inspecting the existing array. We never create or modify the array in any way. All we are doing is looking at it.

                                1 Reply Last reply Reply Quote 0
                                • C
                                  chutestrate
                                  last edited by

                                  Ok, so is this explanation misleading or am I just not reading it correctly. This is where I started going crazy with args.

                                  There is a special variable $Args which contains an array of the parameters passed to a function. Letโ€™s use this variable to show how we can pass an argument using string expantion.
                                  Function HAL {โ€œWhat are you doing $args ?โ€}<enter>
                                  Type in the FunctionName and an Argument:
                                  HAL Dave

                                  You can use multiple $Args variables to pass more than one parameter.

                                  scottalanmillerS 1 Reply Last reply Reply Quote 0
                                  • scottalanmillerS
                                    scottalanmiller @chutestrate
                                    last edited by

                                    @chutestrate said:

                                    There is a special variable $Args which contains an array of the parameters passed to a function. Letโ€™s use this variable to show how we can pass an argument using string expantion.
                                    Function HAL {โ€œWhat are you doing $args ?โ€}<enter>
                                    Type in the FunctionName and an Argument:
                                    HAL Dave

                                    You can use multiple $Args variables to pass more than one parameter.

                                    Oh my, you've gone down the rabbit hole. I see that you are reading this page which is horribly written for teaching:
                                    http://www.powershellpro.com/powershell-tutorial-introduction/powershell-functions-filters/

                                    This is super confusing because of calling functions directly from the command line. Stop trying to use this, this is very hard to read and understand for no good reason. This is accurate, but much more complex and way past the point where you are now. Right now you are just trying to learn the most basic data structures. This is beyond what we've been talking about here (but doesn't conflict in any way.)

                                    1 Reply Last reply Reply Quote 0
                                    • scottalanmillerS
                                      scottalanmiller
                                      last edited by

                                      Nothing in there is wrong or different, he's just adding a complex example of creating a function directly from the command line rather than making a program and calling it that way. There is absolutely no reason to be adding that confusion here. Let's learn this material first then learn how to do that and how that is just another way of looking at what we have already covered.

                                      1 Reply Last reply Reply Quote 0
                                      • C
                                        chutestrate
                                        last edited by

                                        Yeah, I'm kinda good like that, not in a good way. Ok, done with that then. Well, that is the source of my confusion of the "args is an array" now that I'm re reading it.

                                        ok

                                        1 Reply Last reply Reply Quote 0
                                        • scottalanmillerS
                                          scottalanmiller
                                          last edited by

                                          I think the complexity there is that he is calling things in "yet another way." It's good to learn that you can do that (calling a function directly loaded into memory rather than running a full program that you saves) but it is just introducing too many concepts at once rather than one at a time and giving each a chance to sink in before providing the next one.

                                          I find the new system of showing people live shells before teaching them full programs to not be a good one for understanding what programs are doing. But that might just be my old school years talking. I started programming on BASIC in 1985 so my perspective on learning languages is rather tainted by the era in which I did it.

                                          1 Reply Last reply Reply Quote 0
                                          • C
                                            chutestrate
                                            last edited by

                                            Well for whatever reason I just lost power so maybe it's a good reason to look things over again tomorrow. Plus trying to type on phone is tough. I'll try to make the connection of $args again.

                                            1 Reply Last reply Reply Quote 0
                                            • 1
                                            • 2
                                            • 3
                                            • 4
                                            • 5
                                            • 3 / 5
                                            • First post
                                              Last post