2010-01-06 14 views
7

Der Eingabeparameter meines Skripts ist ein Datum oder eine Zahl. Hier ist ein Skript, das funktioniert gut, so können Sie sehen, was ich zu tun versucht:Wie überprüfe ich, ob eine Zeichenfolge ein Datum enthält?

param($date = (Get-Date)) 

if ($date -match "^\d+$") 
{ 
    $date = (Get-Date).AddDays($date) 
} 
elseif ($date -as [DateTime]) 
{ 
    $date = [DateTime]::Parse($date) 
} 
else 
{ 
    'You entered an invalid date' 
    exit 1 
} 

Hier ist mein früherer Versuch, dass nicht Arbeit:

param($date = (Get-Date)) 

if ($date -as [DateTime]) 
{ 
    $date = [DateTime]::Parse($date) 
} 
elseif ($date -match "^\d+$") 
{ 
    $date = (Get-Date).AddDays($date) 
} 
else 
{ 
    'You entered an invalid date' 
    exit 1 
} 

Wenn ich Eingabe einer Zahl, die Skript bricht bei Datum Parsing-Zeile. Es sieht so aus, als ob meine "ist ist Datum" Prüfung wahr zurückgibt, wenn eine Zahl gegeben wird.

Ist es ein Fehler? Ist es von Entwurf?

+0

Es ist meine erste Powershell-Skript, so zögern Sie nicht, meine möglichen Fehler zu zeigen. –

Antwort

10

Ja, können Sie prüfen, ob ein String Datum enthält unter Verwendung ‚(-as [Datetime])‘. Das Problem in meinem ursprünglichen Skript ist, dass ich angenommen habe, dass die Eingabeparameter des Skripts Strings sind. Anscheinend wird der numerische Parameter automatisch in Integer konvertiert, es sei denn, es wird in Anführungszeichen geschrieben. Also, ich hätte schreiben sollen

if ([string]$date -as [DateTime]) 

zwingen Umwandlung von Nummer zurück zu String, wie Keith in seiner Antwort tut.

Gleicher Fehler gilt für meine Ganzzahlprüfung. Das Skript schlägt fehl, wenn "Oct, 3" (ohne Anführungszeichen) angegeben wird. Erstellt PS hier ein Array?

Warum schlägt das Parsen fehl, wenn die Prüfung erfolgreich ist? Johannes erklärte das. Ausdruck

$date -as [DateTime] 

weist PS an, Eingabe in Datum zu konvertieren. Konvertieren der Nummer ist sinnvoll (Datum 1 ist der 01. Januar 0001), so dass es nicht fehlschlägt, wenn eine Nummer vergeben wird. Ausdruck

analysiert speziell eine Zeichenfolge, also gibt es eine Ganzzahl, die keinen Sinn ergibt und zu einem Fehler führt.

Es war Verschwendung von mir, beide zu verwenden. Zuerst konvertiere ich in der Bedingung zum Datum, nur um das Ergebnis wegzuwerfen. Dann erstelle ich das Ergebnis mit anderer Syntax neu.Ich ändere das zu

$date = $date -as [DateTime]; 
if (!$date) 
{ 
    'You entered an invalid date' 
    exit 1 
} 

Dank alle.

6

Nun, Sie können jede ganze Zahl in eine DateTime, einfach, weil DateTime ist nur eine Zahl hinter den Kulissen.

Jede DateTime hat eine Ticks Eigenschaft, die seit 0001-01-01 100 ns Intervalle sind. Sie können eine DateTime mit diesen Ticks initialisieren, obwohl ich bisher keine Verwendung dafür gefunden habe.

PS> ([datetime]1234).Ticks 
1234 

Aber das ist, warum Sie eine Nummer DateTime werfen können und es funktioniert. Es ist wahrscheinlich nur ein Datum sehr weit zurück in der Zeit :-)

Also im Grunde, was Sie jetzt tun, ich. e. Zuerst nach einer Nummer zu suchen, ist der richtige Weg zu gehen, da die Besetzung DateTime nicht ausreicht, um zu bestimmen, ob es ein Datum oder eine Zahl ist.

+0

Ich bevorzuge diesen Ansatz zur Verwendung der Methode [DateTime] :: Parse, da dieser Ansatz einen sehr netten Nebeneffekt hat. Da PowerShell immer versucht, das für einen Parameter benötigte Format zu konvertieren, können Sie diese Funktion mit einfachen Strings in einem beliebigen lokalisierten Datetime-Format aufrufen: dh Foo "1: OO PM", Foo "1/1/2012 20:12 " Hoffe, das hilft –

+0

Ich folge nicht. Das Gleiche funktioniert für DateTime, es verwendet die Kultur des aktuellen Threads beim Parsen der Zeichenfolge. Letztendlich würde ich wagen, dass die PowerShell-Konvertierung bei DateTime.Parse oder DateTime.TryParse endet. Ich sehe keinen Grund, warum sie diesen Code erneut implementieren möchten. –

8

Sie können das .NET Framework helfen Ihnen dabei lassen:

function ParseDate([string]$date) 
{ 
    $result = 0 
    if (!([DateTime]::TryParse($date, [ref]$result))) 
    { 
     throw "You entered an invalid date: $date" 
    } 

    $result 
} 

ParseDate 'June 51, 2001' 
+0

Oder Sie könnten PowerShell das schwere Heben _all_ machen lassen: verwenden Sie einfach [DateTime] $ date' um den Parameter vom Typ 'DateTime' zu ​​machen. –

Verwandte Themen