There was a very interesting post over on the PowerShell team blog on Dynamic Binary Modules where Nigel Sharples describes how to run a cmdlet on a remote machine if you have the source code to the cmdlet and don’t want to deal with any intermediate assembly files to clean up.
I went and tried to do this straight away on my local machine without the remoting bit. I copied some cmdlet source code from MSDN. As a Systems Engineer, I haven’t written many compiled cmdlets in C# but I have edited a few for my liking and written one or two when script just wouldn’t cut it. One thing I have learned is that you always need a Snapin to register your cmdlet. So you have your namespace with a class for your snapin and then a class for each cmdlet that you create.
The bottom line here is that with dynamic modules you don’t need to create a Snapin class for your cmdlet. The only other tweak is that I used the –language parameter on Add-Type to specify CSharpVersion3 so I could use automatic properties and not have to explicitly write the getter and setter for the parameter “Name.”
[string]$code = @" using System.Management.Automation; namespace SendGreetingDemo1 { [Cmdlet(VerbsCommunications.Send, "Greeting")] public class SendGreetingCommand : Cmdlet { [Parameter(Mandatory=true,Position=0)] public string Name {get;set;} protected override void ProcessRecord() { WriteObject("Hello " + Name + "!"); } } } "@ $assembly = (Add-Type -TypeDefinition $code ` -Language CSharpVersion3 ` -passthru ).Assembly $assembly | Import-Module
Entries (RSS)
Nice follow up on that PowerShell post. Been meaning to try the remote piece too.