PowerShell classes – – overloading constructors

You can usually create a .NET object from a class in one of several ways – no parameters i.e. and empty object up to an object with all of its properties populated as you create it. When you define a class you define the various ways in which it can be created – these are known as its constructors. When you have multiple constructors they are known as overloaded constructors i.e. a number of different ways to create the instance.

 

You have seen the default constructor in the previous post:

 

$obj = [LastBoot]::new()

 

You just use new() without any arguments to create the empty object which you then populate. If you know some of the values before you create the object you can use one of the overloads on the constructor to create the object:

 

$obj2 = [LastBoot]::new($comp, $lbtime)

 

Here you’re supplying the computername and last boot time as you create the object.  The class definition looks like this:

 

class LastBoot {
[string]$ComputerName
[string]$LastBootime

LastBoot(){}

LastBoot([string]$computer, [string]$lbt) {
  $ComputerName = $computer
  $LastBootime = $lbt
}

}

$comp = $env:COMPUTERNAME
$lbtime = Get-CimInstance -ClassName Win32_OperatingSystem -ComputerName $comp |
    select -ExpandProperty LastBootUpTime

 

$obj = [LastBoot]::new()

$obj.ComputerName = $comp
$obj.LastBootime = $lbtime

$obj

 

$obj2 = [LastBoot]::new($comp, $lbtime)
$obj2

 

Define the two properties as before. You have to explicitly define the default constructor when you are overloading the constructor:

 

LastBoot(){}

 

That says create a new instance of the LastBoot class but don’t set any properties.

 

Our overload:

LastBoot([string]$computer, [string]$lbt) {
  $ComputerName = $computer
  $LastBootime = $lbt
}

 

says create an instance of LAstBoot and I’m going to give you the computer name and last boot time. Map what you’re given to the ComputerName and LastBootime properties as shown.

 

Use the default constructor like this:

$obj = [LastBoot]::new()

 

And the overload like this

$obj2 = [LastBoot]::new($comp, $lbtime)

 

In case you’re wondering why this will useful to know – the simple answer is that you can create DSC resources using PowerShell classes which makes them much easier to write. But before we get to that you need to fully understand how PowerShell classes work.

 

Warning – PowerShell 5.0 is still in preview stage so this could change

Posted in PowerShell v5 | Leave a comment

PowerShell 5.0 – – classes

I’ve shown this method of creating a new object several times:

 

$source = @”
public class LastBoot
{
  public string ComputerName {get; set;}
  public string LastBootime {get; set;}
}
“@

Add-Type -TypeDefinition $source -Language CSharpVersion3

$computer = $env:COMPUTERNAME

$props = [ordered]@{
  ComputerName = $computer
  LastBootime = Get-CimInstance -ClassName Win32_OperatingSystem -ComputerName $computer |
    select -ExpandProperty LastBootUpTime
}

New-Object -TypeName LastBoot -Property $props

 

Define a class in C# – in this case a simple class that has 2 properties ComputerName and LastBootime which are both strings for simplicity.  Compile the code via Add-Type

 

Define the value of the properties in a hash table and create an object.

 

This approach has a number of benefits – you have given your object a distinct type so you can easily create format and type data for it. Also the properties are strongly typed which means if to try to define a property with a value that isn’t of the correct type or can’t be converted into the correct type the creation will fail.

 

The drawbacks are that you have to use C# to define the class and Add-Type won’t let you redefine the class in the PowerShell session in which you create it.

 

The drawbacks, especially the first one, put most peopel off from using this approach.

 

PowerShell 5.0 has simplified working like this as you can now create classes directly in PowerShell.

 

class LastBoot {
[string]$ComputerName
[string]$LastBootime
}

$obj = [LastBoot]::new()

$obj.ComputerName = $env:COMPUTERNAME
$obj.LastBootime = Get-CimInstance -ClassName Win32_OperatingSystem -ComputerName $computer |
    select -ExpandProperty LastBootUpTime

$obj

 

Use the class keywaird to start the class definition. The properties are defined in a similar way to advanced functions – note there isn’t a comma after the function.

 

A new instance is created like this:

$obj = [LastBoot]::new()

 

You can’t use New-Object in the latest version of PowerShell 5.0  – I presume that will be added at some thime.

 

You can then populate the properties and output the object.

 

This is just scratching the surface with classes. This whole addition will make working with new objects more flexible as you can easily define what you want your output object to be like and then PowerShell will enforce the property types for you.

In case you were wondering use LastBootime was deliberate  Smile

Posted in PowerShell v5 | Leave a comment

PowerShell 5 – zip and unzip

One the extras in PowerShell 5.0 is a couple of cmdlets for workign with zip archives. Actually, you’ll find they are PowerShell advanced functions if you look in the module which you’ll find at C:\Windows\System32\WindowsPowerShell\v1.0\Modules\Microsoft.PowerShell.Archive

You get 2 cmdlets:

£> Get-Command *archive | ft CommandTYpe, Name -a

CommandType Name
———– —-
   Function Compress-Archive
   Function Expand-Archive

To compress

$files = Get-ChildItem -Path C:\Scripts -Filter *.csv | select -ExpandProperty Fullname
Compress-Archive -Path $files -DestinationPath C:\Scripts\t1.zip -CompressionLevel Optimal

or a single file

Compress-Archive -Path c:\scripts\test.csv -DestinationPath C:\Scripts\t2.zip -CompressionLevel Optimal

 

To uncompress

Expand-Archive -Path C:\Scripts\t1.zip  -DestinationPath c:\scripts

if you need to overwrite files:

Expand-Archive -Path C:\Scripts\t1.zip  -DestinationPath c:\scripts -Force

Posted in PowerShell v5 | Leave a comment

Run with PowerShell

Came across  something new today – Run with PowerShell.

if you have PowerShell 3.0 or later installed – right click on your script and select “Run with PowerShell”

A few rules though – The script can’t take parameters or output anything to the prompt. You can’t interact with the script or the console window.

Execution policy is set to Bypass – not sure I like that idea  – unless the ExecutionPolicy is Allsigned in which case only signed scripts can be run this way.  See about_Run_With_PowerShell for more details

Posted in Powershell | Leave a comment

DSC for Exchange

A series of posts on using the Exchange DSC resources – starts here

http://blogs.technet.com/b/mhendric/archive/2014/10/17/managing-exchange-2013-with-dsc-part-1-introducing-xexchange.aspx

Posted in Powershell | Leave a comment

Upgrading PowerShell

The Scripting Guy has started a series on upgrading the version of  PowerShell you run.  My article in the series is out today – http://blogs.technet.com/b/heyscriptingguy/archive/2014/10/20/should-i-upgrade-to-latest-windows-powershell-version.aspx

Posted in Powershell | Leave a comment

DSC Resource Kit Wave 8 coming?

Looks like the next wave of the DSC resource kit is on its way – a set of resources for Exchange 2013 have been published – https://gallery.technet.microsoft.com/office/xExchange-PowerShell-1dd18388 with a wave 8 tag.

 

I’ve been waiting for the Exchange resources – they’re going to make my life soooooo much easier

Posted in Powershell | Leave a comment