2017-08-10 15 views
0

Ich versuche, eine Validierungsprüfung für ein Array einzurichten. Ich habe folgendeValidieren Sie gegen ein Array

$ValidDomain = "*.com","*.co.uk" 
$ForwardDomain = Read-Host "What domain do you want to forward to? e.g. contoso.com" 
#while (!($ForwardDomain -contains $ValidDomain)) { 
while (!($ValidDomain.Contains($ForwardDomain))) { 
    Write-Warning "$ForwardDomain isn't a valid domain name format. Please try again." 
    $ForwardDomain = Read-Host "What domain do you want to forward to? e.g. contoso.com" 
} 

Die kommentierte while Linie ist nur eine Alternative, wie ich diese getestet habe.

Wenn ich bei der Eingabeaufforderung von Read-Host "fjdkjfl.com" eingeben, zeigt dies die Warnmeldung an, anstatt zu sagen, dass sie gültig ist, und schleift weiter.

Ich habe versucht, mit -match statt -contains aber die Meldung:

Parsing "* com * co.uk" - Quantifizierer {x, y} folgenden nichts.

Habe ich das völlig falsch?

Antwort

2

Contains() und -contains funktionieren nicht so, wie Sie es erwarten. Verwenden Sie ein regular expression statt:

$ValidDomain = '\.(com|co\.uk)$' 
$ForwardDomain = Read-Host ... 
while ($ForwardDomain -notmatch $ValidDomain) { 
    ... 
} 

Sie $ValidDomain aus einer Liste von Zeichenketten wie folgt konstruieren:

$domains = 'com', 'co.uk' 
$ValidDomains = '\.({0})$' -f (($domains | ForEach-Object {[regex]::Escape($_)}) -join '|') 

Regulärer Ausdruck Aufschlüsselung:

  • .: Der Punkt ist ein Sonderzeichen, das passt auf ein beliebiges Zeichen mit Ausnahme von Zeilenumbrüchen. Um einen literalen Punkt zu finden, benötigen Sie die Escape-Sequenz \..
  • (...): Klammern definieren eine (erfassende) Gruppe oder Unterausdruck.
  • |: Das Rohr definiert einen Wechsel (im Grunde ein "OR"). Alternationen werden typischerweise in Gruppierungskonstrukte eingefügt, um den Wechsel vom Rest des Ausdrucks zu unterscheiden.
  • $: Das Dollarzeichen ist ein Sonderzeichen, das dem Ende einer Zeichenfolge entspricht.

Die {0} im Format-String für den -f Operator ist nicht Teil des regulären Ausdrucks, aber wo ein Platzhalter, definiert (und gegebenenfalls wie) das zweite Argument des Bedieners in das Format Zeichenfolge eingefügt wird.

+0

Vielen Dank. Funktioniert wie ein Leckerbissen. Ich bin ein wenig verwirrt mit der Syntax für die $ ValidDomain-Variable. Mehr noch die "\" & "$" Zeichen und die Platzierung von "(" & ")". Danke für die Konstrukt-Ergänzung, sehr nützlich. – jshizzle

+0

Noch besser danke. Viel klarer. Das einzige, was mich jetzt verwirrt, ist, dass ich '(\ .com | co \ .uk) $' erwarten würde, aber warum ist die Opener-Klammer dort, wo sie ist? – jshizzle

+0

Eigentlich sehe ich es. Es sagt im Grunde einen Literalpunkt für alles vor jedem in den Klammern aufgeführten Element. Danke, danke. – jshizzle

Verwandte Themen