Nicht wirklich schwierig, aber gut zu wissen: Nehmen wir mal eine Funktion, die irgendwas mit einem Array aus Strings machen soll. Und weil wir sie nicht umsonst aufrufen wollen, deklarieren wir diesen Parameter als verbindlich:
function Do-Something { [CmdletBinding()] Param( [Parameter (Mandatory=$true)][string[]]$in_content ) foreach ($x in $in_content) { $col = Get-Random @('Red','Yellow','Green') Write-Host $x -ForegroundColor $col } }
Wenn wir also Do-Something ‚blahblahblah‘ oder Do-Something @(‚blah‘,’suelz‘,’foo‘,’bar‘) aufrufen, bekommen wir das erwartete Ergebnis. Die Funktion sollte aber in meinem Fall Inhalte von Textdateien verarbeiten:
Do-Something (Get-Content 'c:\temp\textfile01.txt')
Und siehe da, prompt bekam man den Fehler „Do-Something : Cannot bind argument to parameter ‚in_content‘ because it is an empty string.„. Offensichtlich enthält die Textdatei eine leere Zeile, und diese wird durch den Mandatory-Dekorator geblockt.
Um dies zu umgehen, kann man den Parameter wie folgt definieren:
[Parameter (Mandatory=$true)][AllowEmptyString()][string[]]$in_content
Ganz ohne Argument kann man die Funktion danach immer noch nicht aufrufen. Happy scripting!
Antworten