filippg
Goto Top

PowerShell function und return

Hallo,

ich will in PowerShell eine Funktion schreiben, die einen Wert zurück gibt. Dabei stoße ich auf das eine Funktion alles Output zurück gibt, was nicht aufgefangen wird.

function Clean-String([string] $toClean, [string]$returnValue){
	$sb = New-Object -TypeName "System.Text.StringBuilder"  
	$replaceChars = @{"ä" = "ae"; "ö" = "oe"}  
	
	[string] $c
	for([int] $i = 0; $i -lt $toClean.Length; $i++){
		$c = ($toClean[$i]).ToString()
		if($replaceChars.ContainsKey($c)){
			$sb.Append($replaceChars[$c])
			
		} else {
			$sb.Append($c)
		}
	}
	return $sb.ToString()
}

$a = Clean-String "Ärgerlöch"  
Write-Host $a

gibt eben nicht "aergerloech" zurück, sondern gleich 10x aergerloech (was dann natürlich schon sehr ärgerlich ist). Sucht man ein wenig, so findet man heraus, dass das Problem durchaus bekannt ist. Aber was ich noch nicht finden konnte ist eine Lösung dafür. Wenn man vor das $sb.Append ein [void] setzt, bekommt man nur ein aergerloech, aber davor ein Leerzeichen. Man müsste also bei jeder FUnktion genau suchen, welche Zeile alles einen Output produziert, und den dann jeweils unterdrücken. Aber das kann doch wohl nicht die Lösung sein! Gibt es kein "Verwerfe allen Output", damit dann anschließend tatsächlich nur der bei return angegebenen Wert zurückgegeben wird?

Gruß

Filipp

Content-Key: 185522

Url: https://administrator.de/contentid/185522

Printed on: April 16, 2024 at 17:04 o'clock

Member: dog
dog May 27, 2012 at 01:00:10 (UTC)
Goto Top
Die Lösung ist doch recht einfach zu finden:
http://rkeithhill.wordpress.com/2007/09/16/effective-powershell-item-7- ...

Dort gibt es sogar dein Beispiel mit dem StringBuilder und die genaue Erklärung, warum das passiert.

Und jetzt schauen wir mal warum [void] nicht funktioniert:
echo $a.GetType().FullName
echo $a
System.Object
a
aergerloech

Du bekommst also immer noch ein Array zurück, also hast du vergessen was zu capturen.
Und wenn du jetzt deinen Code durchgehst, dann siehst du recht schnell, dass dein
[string] $c
daran schuld ist.
Und das ist ohnehin überflüssig, weil in Powershell Variablen nicht vor der Benutzung deklariert werden müssen.

echo $a.GetType().FullName
echo $a
System.String
aergerloech

Schon passt es...
Member: filippg
filippg May 27, 2012 at 12:24:35 (UTC)
Goto Top
Hallo Dog,

danke für die Antwort. Der Knackpunkt liegt im
Und wenn du jetzt deinen Code durchgehst, dann siehst du recht schnell, dass ...
daran schuld ist.
Es muss doch eine Lösung geben, mit der man das generisch lösen kann. Denn erstens habe ich das nicht "recht schnell" gesehen, sondern gar nicht, und zweitens kann es ja auch mal sein, dass ich eine Function mit ein paar Zeilen mehr schreiben will, bei der es dann auch du oder sonstwer nicht mehr recht schnell sieht. In sofern also: das konkrete Problem ist gelöst, danke für die Hilfe. Aber Generell muss es da einfach noch etwas geben.

Gruß

Filipp
Member: filippg
filippg Jun 08, 2012 updated at 23:14:52 (UTC)
Goto Top
Hallo,

also, eine wirklich hübsche Lösung habe ich noch nicht, aber eine, die es einem erspart, in großen Funktionen stundenlang zu suchen, welche Zeile denn nun einen Wert auf die Pipe legt. Ich verwende jetzt Set-Variable.

PS C:\> function returnSomething ($retVarName) { $wert = "Zurueck" ; Set-Variable -Value $wert -Name $retVarName -Scope 1 }  
PS C:\> returnSomething "foo"  
PS C:\> $foo
Zurueck

Grüße

Filipp