Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. The Lounge
  3. PowerShell AND C#

PowerShell AND C#

Scheduled Pinned Locked Moved The Lounge
csharpquestiondiscussiondotnetwindows-admin
26 Posts 14 Posters 0 Views 1 Watching
  • 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.
  • M MSBassSinger

    I am starting to learn PowerShell. I have avoided it for years, because whatever I needed to do beyond a simple BAT file, I could do in C#. However, I am in a situation where I have to use PowerShell, so I am learning it. One of the things I learned is that within a PowerShell script, you can call .cs files to run C# code. So this question came to mind, and I thought you all might have some opinions. I wrote a PS script that calls a .cs file and does exactly what I described. I have not mastered calling non-GAC .NET library DLLs yet, but I am working on it. Why not use PowerShell as a management script, and write C# code to execute the "business logic"? I am not convinced that it is better to use PowerShell cmdlets to hack up some brittle script to do what can be more easily done in C#, which is far more capable and wider-ranging than PowerShell script. This is a snippet from my script:

    ## Load the C# code file

    Namespace PSTest

    Class SomeCSClass

    $Source = Get-Content "SomeCSClass.cs" -Raw

    Add the class(es) from the C# code to use

    Add-Type -TypeDefinition $Source

    Instantiate the object(s)

    $TestDLL = New-Object PSTest.SomeCSClass

    Build the path for test files (non-static method)

    $TestFilePath = $TestDLL.GetCurrentDirectory() + "\PowerShell Example Files\"

    Get a list of files using C# code from a static method

    $Files = [PSTest.SomeCSClass]::GetListOfFiles($TestFilePath, "*.txt", 0)

    Your thoughts?

    R Offline
    R Offline
    rnbergren
    wrote on last edited by
    #14

    *shudder* PS is for scripting and for automation. It to me was just another language that could enable me to do a few more things than a bat file did and it was going to be "more" supported by MS going forward. C# is a programming language that you make things(objects) out of. you can call .net objects from PS and that is what PS is for. Keep C# where it belongs and PS where it belongs. I really think too often we all(myself included) get stuck in our ways and avoid learning something new just because at fist glance we don't like it. PowerShell is just another technology. Once learned you will see some benefits. Granted C# is more powerful. But each has their purpose in the MS exosphere.

    To err is human to really elephant it up you need a computer

    M 1 Reply Last reply
    0
    • M Member 9167057

      You could also call .NET from PS. That way, you don't mix 2 languages. .NET methods don't look perfectly not-out-of-place in PS but the result will still be way more maintainable than calling C# files from PS.

      M Offline
      M Offline
      MSBassSinger
      wrote on last edited by
      #15

      I find it easily maintainable.

      1 Reply Last reply
      0
      • S Southmountain

        is it possible for you to write up a post on this topic?

        diligent hands rule....

        M Offline
        M Offline
        MSBassSinger
        wrote on last edited by
        #16

        Thanks for the suggestion. I’ll see if I can find the time while on vacation in a couple of weeks.

        1 Reply Last reply
        0
        • R rnbergren

          *shudder* PS is for scripting and for automation. It to me was just another language that could enable me to do a few more things than a bat file did and it was going to be "more" supported by MS going forward. C# is a programming language that you make things(objects) out of. you can call .net objects from PS and that is what PS is for. Keep C# where it belongs and PS where it belongs. I really think too often we all(myself included) get stuck in our ways and avoid learning something new just because at fist glance we don't like it. PowerShell is just another technology. Once learned you will see some benefits. Granted C# is more powerful. But each has their purpose in the MS exosphere.

          To err is human to really elephant it up you need a computer

          M Offline
          M Offline
          MSBassSinger
          wrote on last edited by
          #17

          PS is built on .NET and uses objects. Think of the approach I use the same principle as separating business logic from UI logic. I separate the business logic (much better done in C#) from the scripting logic (simpler work better done in PS).

          J 1 Reply Last reply
          0
          • M MSBassSinger

            PS syntax is not intuitive. It is awful to work with. What I do is create a C# library DLL project, and write unit tests for the class(es). Then I include my ps1 file, which I can run from within VS by using the PS ISE, which loads the cs file. That gives me good source control, good testing, and minimal “script kiddie” coding. C# is far more versatile and elegant with which to code. Since our team standardized on PS long before I got there (DevOps stuff), it then is compatible with what others are doing by staying within the PS world.

            D Offline
            D Offline
            dandy72
            wrote on last edited by
            #18

            MSBassSinger wrote:

            C# is far more versatile and elegant with which to code

            Well obviously. PS and C# serve completely different purposes.

            1 Reply Last reply
            0
            • M MSBassSinger

              PS is built on .NET and uses objects. Think of the approach I use the same principle as separating business logic from UI logic. I separate the business logic (much better done in C#) from the scripting logic (simpler work better done in PS).

              J Offline
              J Offline
              jochance
              wrote on last edited by
              #19

              IIRC, Powershell is written/implemented in C#.

              M 1 Reply Last reply
              0
              • M MSBassSinger

                I am starting to learn PowerShell. I have avoided it for years, because whatever I needed to do beyond a simple BAT file, I could do in C#. However, I am in a situation where I have to use PowerShell, so I am learning it. One of the things I learned is that within a PowerShell script, you can call .cs files to run C# code. So this question came to mind, and I thought you all might have some opinions. I wrote a PS script that calls a .cs file and does exactly what I described. I have not mastered calling non-GAC .NET library DLLs yet, but I am working on it. Why not use PowerShell as a management script, and write C# code to execute the "business logic"? I am not convinced that it is better to use PowerShell cmdlets to hack up some brittle script to do what can be more easily done in C#, which is far more capable and wider-ranging than PowerShell script. This is a snippet from my script:

                ## Load the C# code file

                Namespace PSTest

                Class SomeCSClass

                $Source = Get-Content "SomeCSClass.cs" -Raw

                Add the class(es) from the C# code to use

                Add-Type -TypeDefinition $Source

                Instantiate the object(s)

                $TestDLL = New-Object PSTest.SomeCSClass

                Build the path for test files (non-static method)

                $TestFilePath = $TestDLL.GetCurrentDirectory() + "\PowerShell Example Files\"

                Get a list of files using C# code from a static method

                $Files = [PSTest.SomeCSClass]::GetListOfFiles($TestFilePath, "*.txt", 0)

                Your thoughts?

                K Offline
                K Offline
                KLPounds
                wrote on last edited by
                #20

                I love to see another cohort participating in such crimes against humanity.:laugh: This reminds me of about 10 years ago when I cut my teeth with PS at a bank I worked at. I had ended up building a whole Console app AutoUtils.exe in VB.NET for handling day to day maintenance on the dev and QA environments as well as some security auditing functions via Batch files. After the bare metal server migrations to VMs in a blade rack a few months later, IT Jesus decided suddenly PS was king and the only accepted tool for scripting. I left there before I got the chance to rewrite the AutoUtils as PS scripts. But the ability to consume .net appcode directly in PS was something I was excited to leverage. At my last job, our senior started establishing devops practices and the number of servers between our 2 datacenters was significant. He started using PS with C# helpers for handling specific build workflows between environments and datacenters. Last time I talked to him, he uses it at his new job unraveling several years of user induced "point and click" workflows that had no need being manual. Told me he has written several C# helpers. No shame in using what works for your use case.

                1 Reply Last reply
                0
                • M MSBassSinger

                  I am starting to learn PowerShell. I have avoided it for years, because whatever I needed to do beyond a simple BAT file, I could do in C#. However, I am in a situation where I have to use PowerShell, so I am learning it. One of the things I learned is that within a PowerShell script, you can call .cs files to run C# code. So this question came to mind, and I thought you all might have some opinions. I wrote a PS script that calls a .cs file and does exactly what I described. I have not mastered calling non-GAC .NET library DLLs yet, but I am working on it. Why not use PowerShell as a management script, and write C# code to execute the "business logic"? I am not convinced that it is better to use PowerShell cmdlets to hack up some brittle script to do what can be more easily done in C#, which is far more capable and wider-ranging than PowerShell script. This is a snippet from my script:

                  ## Load the C# code file

                  Namespace PSTest

                  Class SomeCSClass

                  $Source = Get-Content "SomeCSClass.cs" -Raw

                  Add the class(es) from the C# code to use

                  Add-Type -TypeDefinition $Source

                  Instantiate the object(s)

                  $TestDLL = New-Object PSTest.SomeCSClass

                  Build the path for test files (non-static method)

                  $TestFilePath = $TestDLL.GetCurrentDirectory() + "\PowerShell Example Files\"

                  Get a list of files using C# code from a static method

                  $Files = [PSTest.SomeCSClass]::GetListOfFiles($TestFilePath, "*.txt", 0)

                  Your thoughts?

                  K Offline
                  K Offline
                  Kirk 10389821
                  wrote on last edited by
                  #21

                  In speaking with a security expert. His #1 recommendation was to disable PowerShell! He said about 80% of the FILELESS (undetectable) infiltrations use PowerShell. Since I was not a big user of it, I simply disabled it. It would be TOUGH for me to enable it. Just an interesting point!

                  1 Reply Last reply
                  0
                  • J jochance

                    IIRC, Powershell is written/implemented in C#.

                    M Offline
                    M Offline
                    MSBassSinger
                    wrote on last edited by
                    #22

                    Written in C#, uses .NET, but the syntax is nothing like C#. IMHO, they would have been better off creating a C# library for static commands that are now verb-noun syntax and keeping the familiar C# syntax.

                    J 1 Reply Last reply
                    0
                    • M MSBassSinger

                      Written in C#, uses .NET, but the syntax is nothing like C#. IMHO, they would have been better off creating a C# library for static commands that are now verb-noun syntax and keeping the familiar C# syntax.

                      J Offline
                      J Offline
                      jochance
                      wrote on last edited by
                      #23

                      If you think about the C# to open a process and pass it arguments, the Powershell syntax is less verbose than that would be. Part of it is they started kicking around together as kids and since neither was an adult it's a lord of the flies sort of deal. (Much respect to both, but not giving up the metaphor.) C# only not terribly long ago (C# 3/4, respectively) added var/dynamic that would enable some of what powershell is doing with sticking command results into objects. The typical problem space (system administration/networking/security?) also has all these concerns that you simply do not have with the majority of what C# code out there is doing. I'm not saying I wouldn't love it if it PowerShell were more C#-y and less whatever it is. But I do see challenges and reasons not to simply say "let's make it a C# console that sends input (script file or otherwise) straight to IL and onwards to a shell-specific runtime". Nowadays? Even if the guy tasked with and enabled to undertake a massive re-write of PowerShell looked at the state of things and decided that approach was a really good way to go? Well you've got all this baggage that plane simply wouldn't carry. There are probably many many folks less C# dev and more really smart scripter-admins (or wanting nothing to do with writing any of it) who depend on what's there and if you pulled the rug in the name of "code sanity" they would be very unhappy. Maybe it would be possible for the interpreter to detect "old-style" vs "new" and translate the old stuff on the fly...

                      M 1 Reply Last reply
                      0
                      • J jochance

                        If you think about the C# to open a process and pass it arguments, the Powershell syntax is less verbose than that would be. Part of it is they started kicking around together as kids and since neither was an adult it's a lord of the flies sort of deal. (Much respect to both, but not giving up the metaphor.) C# only not terribly long ago (C# 3/4, respectively) added var/dynamic that would enable some of what powershell is doing with sticking command results into objects. The typical problem space (system administration/networking/security?) also has all these concerns that you simply do not have with the majority of what C# code out there is doing. I'm not saying I wouldn't love it if it PowerShell were more C#-y and less whatever it is. But I do see challenges and reasons not to simply say "let's make it a C# console that sends input (script file or otherwise) straight to IL and onwards to a shell-specific runtime". Nowadays? Even if the guy tasked with and enabled to undertake a massive re-write of PowerShell looked at the state of things and decided that approach was a really good way to go? Well you've got all this baggage that plane simply wouldn't carry. There are probably many many folks less C# dev and more really smart scripter-admins (or wanting nothing to do with writing any of it) who depend on what's there and if you pulled the rug in the name of "code sanity" they would be very unhappy. Maybe it would be possible for the interpreter to detect "old-style" vs "new" and translate the old stuff on the fly...

                        M Offline
                        M Offline
                        MSBassSinger
                        wrote on last edited by
                        #24

                        I am not advocating to change it. It is too late. They missed the boat on making PS something good for non-developer DevOps folks and for C# developers. But it would be great if they would simply streamline the way a .NET DLL, not in the GAC, is loaded for use. My reason for this is be able to apply a separation of concerns - administrative (PS script) vs business rules (C#).

                        J 1 Reply Last reply
                        0
                        • M MSBassSinger

                          I am not advocating to change it. It is too late. They missed the boat on making PS something good for non-developer DevOps folks and for C# developers. But it would be great if they would simply streamline the way a .NET DLL, not in the GAC, is loaded for use. My reason for this is be able to apply a separation of concerns - administrative (PS script) vs business rules (C#).

                          J Offline
                          J Offline
                          jochance
                          wrote on last edited by
                          #25

                          Yes, makes sense maybe. I suppose without getting into the weeds of it, my knee-jerk would be that if business rules are branching scripting logic then maybe it is anywhere from not awful to preferential for them to live as a part of it. But I picture a scenario like you are a cloud host and depending on client tier you want to spin some resources up on group A vs group B hardware (more muscle). You might call into C# to get that client tier, but based on the result the A/B specifics are part of the script.

                          1 Reply Last reply
                          0
                          • S Southmountain

                            is it possible for you to write up a post on this topic?

                            diligent hands rule....

                            K Offline
                            K Offline
                            Kate X257
                            wrote on last edited by
                            #26

                            Yes. I've been wanting to write something, might as well be this.

                            1 Reply Last reply
                            0
                            Reply
                            • Reply as topic
                            Log in to reply
                            • Oldest to Newest
                            • Newest to Oldest
                            • Most Votes


                            • Login

                            • Don't have an account? Register

                            • Login or register to search.
                            • First post
                              Last post
                            0
                            • Categories
                            • Recent
                            • Tags
                            • Popular
                            • World
                            • Users
                            • Groups