Author Posts

August 1, 2018 at 9:18 am

Hello,
After hours of trying out various possibilities, I am at a dead end on a very simple DATE validation Function.
The Function was copied from:

#PSTip How to check if a DateTime string is in a specific pattern


Here is the full text

Function Test-DateTimePattern
param(
        [string]$String,
        [string]$Pattern,
        [System.Globalization.CultureInfo]$Culture = (Get-Culture),
        [switch]$PassThru
    )
 
    $result = try{ [DateTime]::ParseExact($String,$Pattern,$Culture) } catch{}
    if ($PassThru -AND $result) { $result } else { [bool]$result }
}

I have been using it for several weeks now and find it very useful.
Now I wish to use the 4th parameter $Passthru, in order to get the [DateTime] object back — note that the input is of [string] type. So I invoked the Function with the 4th parameter (switch) using $True as the input.
My question is: WHERE is the valid [DateTime] object that is presumably returned if it parsed correctly?
The Function returns a [boolean] object type, so I cannot figure out where/how the [DateTime] object is.

Would be grateful for any hints, advice or tips.
Thanking you in advance.

August 1, 2018 at 11:54 am

When the PassThru switch is set to TRUE, the output type in not boolean..

PS D:\Sandbox> Test-DateTimePattern -String '12:15 PM' -Pattern t
True

PS D:\Sandbox> Test-DateTimePattern -String '12:15 PM' -Pattern t -PassThru:$true

Wednesday, August 1, 2018 12:15:00 PM

the valid [DateTime] object is returned on the TRUE branch of the if statement on line 10 – note that $result in this branch is not type-cast as [bool] retaining its PowerShell assigned [DateTime] type from the successful TRY statement on line 9

August 1, 2018 at 3:33 pm

It's a switch; you just do -PassThru. the :$true is very rarely necessary.

August 2, 2018 at 7:20 am

Thank you Sam, but when I tried to "get" the [DateTime] as follows:

$V = Test-DateTimePattern .... (parms omitted)

I got an error message that says I cannot assign $True to $V. It seems to me there is a chicken-and-egg situation here:

1 – to see first if my inputs were valid, I must have a IF statement on $V after the method call.
2 – If valid, then I access $V as the "returned valid parse", i.e., the desired [dateTime] object ... but in this case I get an error because $V according to PS is boolean.

My question again is, How can I "get to" the RETURNED [DateTime] object? Where is it sitting? Is it via assignment to a variable? I know I get the correct [DateTime] returned when it prints on the screen but that's when I run it directly. What I want is to get hold of that [DateTime] object so I can perform more validity checks such as how old, etc.
Hope this clarifies my dilemma/question/lack of understanding.
Many thanks.

August 2, 2018 at 7:24 am

Thanks Joel, but my dilemma is to get access to the RETURNED, and VALIDATED, [DateTime] object.
So when I assign the method call to a variable, e.g.,
$V = Test-DateTimePattern ....
and then try to use $V as [DateTime] (e.g., .AddDays) I get an error about using a [boolean].
Hope this clarifies. See my reply to Sam Boutros on this same thread.
Much thanks.