Search code examples
powershellobjecttypes

Store an integer in a custom object with powershell


I like to use constructs like the following in powershell. They make following what is happening 6 months later a lot easier.

$processConfig = New-Object -TypeName psobject
$processConfig | Add-Member -MemberType NoteProperty -Name StartDate -Value ($startofweek)
$processConfig | Add-Member -MemberType NoteProperty -Name StartDateStr -Value (Get-Date $processConfig.StartDate -Format "yyyyMMdd HH:mm:ss")
$processConfig | Add-Member -MemberType NoteProperty -Name EndDate -Value ($endofweek)
$processConfig | Add-Member -MemberType NoteProperty -Name EndDateStr -Value (Get-Date     $processConfig.EndDate -Format "yyyyMMdd HH:mm:ss")
$processConfig | Add-Member -MemberType NoteProperty -Name TargetDir -Value  "C:\Scripts\out\"

$dbConfig = New-Object -TypeName psobject
$dbConfig | Add-Member -MemberType NoteProperty -Name Server -Value "server.address"
#etc

However, I cannot for the life of me figure out how to store a plain int as a property. I've tried a few different things.

Requires a MemberType

$processConfig | Add-Member -TypeName System.Int32 -Name TrimLeadingLines -Value 3

Then why is Property a suggested value for the argument?

$processConfig | Add-Member -MemberType Property -TypeName System.Int32 -Name TrimLeadingLines -Value 3

Add-Member : Cannot add a member with type "Property". Specify a different type for the MemberTypes parameter.
At C:\Scripts\kh_tca_export_ftps.ps1:80 char:18
+ ... essConfig | Add-Member -MemberType Property -TypeName System.Int32 -N ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [Add-Member], InvalidOperationException
    + FullyQualifiedErrorId : CannotAddMemberType,Microsoft.PowerShell.Commands.AddMemberCommand

Thinking sideways, but a bit dodgy

$processConfig | Add-Member -MemberType ScriptProperty -TypeName System.Int32 -Name TrimLeadingLines -Value { return 3 }

I do not want to store a string representation I then need to cast. Yes i can use a $var. Is there a simple straightforward way to store an Integer/Int32 in Powershell Custom Object?


Solution

  • I have always done [int]3 as per below. Works well when I need to store an int in an object.

    $processConfig | Add-Member -MemberType NoteProperty -Name TrimLeadingLines -Value $([int]3)
    

    This returns an Int32 as the property type.

    PS C:\> $processConfig.TrimLeadingLines.GetType()
    
    IsPublic IsSerial Name  BaseType        
    -------- -------- ----  --------        
    True     True     Int32 System.ValueType