derhoeppi
Goto Top

Variablenverwaltung von .Included Skripten

Ich habe mal eine Frage zu Skripten die ich in andere Skripte einbinde. Derzeit habe ich ein Skript in dem ausschließlich Funktionen stecken. Unter anderem eine Funktion zum Laden von Modulen. Diese Funktion liest den aktuellen Zustand aus dem System aus und prüft das gegen einen Modulname der übergeben wird. In meinem Hauptscript rufe ich nun diese Funktion auf. Dabei ist mir aufgefallen, dass bei jedem Funktionsaufruf das lokale System nach seinen vorhanden Modulen abgefragt wird. Bei ein oder zwei Modulen sicherlich kein Problem, aber wenn dort 5 oder 6 Module stehen, dann dauert es einfach zu lange. Deshalb meine Frage, wie ich verhindern kann das jedes Mal nach dem Beenden der Funktion die Variable geleert wird. Hilft es an dieser Stelle nur die Variable als globale Variable zu setzen?
Kann mir vielleicht jemand verraten, wie das Scripthandling von inkludierten Skripten via .Sourcing geschieht. Bleibt das inkludierte Skript die ganze Zeit geladen? Die Frage stelle ich nur, weil es unter Umständen reichen würde den Scope der Variable von global auf script zu ändern.

Gruß
derhoeppi

Content-Key: 362646

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

Printed on: April 25, 2024 at 00:04 o'clock

Mitglied: 135333
Solution 135333 Jan 27, 2018 updated at 13:39:17 (UTC)
Goto Top
Hi.
Hilft es an dieser Stelle nur die Variable als globale Variable zu setzen?
Ja kannst du machen, aber du musst eigentlich nur deine Funktion umbauen das sie ein Array aus Strings akzeptiert dann brauchst du die Funktion nicht mehrfach aufrufen und enumerierst die Module nur einmal für alle abgefragten Module indem du die Namen als Array übergibst.
function GetModules([string[]]$names){
     #....
}
Zum Dot-Sourcing und Scope von Variablen lese doch bitte erst mal about_Scopes, dort steht alles wesentliche was du dazu wissen musst.

Gruß snap
Member: derhoeppi
derhoeppi Jan 28, 2018 at 13:26:06 (UTC)
Goto Top
Hey snap,

danke für deine Hilfe. Ich übergebe nur das Array und bearbeite dieses in der Funktion. Nun habe ich jedoch ein Problem mit der Funktion. Zum Zeitpunkt als ich noch einen String in die Funktion gegeben habe, konnte ich mit Return meine Ausgabe parsen, so dass ich entsprechend agieren kann. Wenn ich nun ein Array in die Funktion gebe, habe ich das Problem das ich nicht mehr auf das einzelne Array Element reagieren kann.
Zum Verständnis hier meine Funktion:
function Test-Module
{
	[CmdletBinding()]
	param
	(
			[Parameter(Mandatory = $true)]
			[ValidateNotNullOrEmpty()]
			[array]$ModuleName,
			[bool]$LoadModule
	)
	$result = ""  
	#Write-Host $ModuleName
	#Write-Host "Anzahl der geladenen Module" $LoadedModules.Count 
	if (!($LoadedModules) -or !($AllModules))
	{
			$LoadedModules = Get-Module | select Name
			$AllModules = Get-Module -ListAvailable | select Name
	}
	foreach ($Module in $ModuleName)
	{
		Write-Host $Module
		if ($AllModules.Name -like $Module)
		{
			if ($LoadedModules.Name -contains $Module)
			{
				$result += $Module + " loaded "  
			}
			else
			{
				if ($LoadModule -eq $true)
				{
					Import-Module $Module
				}
				else
				{
					$result += $Module + "not loaded "  
				}
			}
		}
		else
		{
			
			$result += $Module + " is not available "  
		}
	}
	return $result
}

Die Funktion möchte ich aus diversen Skripten nutzen. Mal möchte ich nur sehen, ob Module auf dem Rechner vorhanden sind und zum anderen möchte ich über den Parameter LoadModule steuern können, dass er die Module lädt, wenn sie auf dem Rechner verfügbar sind. Wenn sie jedoch nicht vorhanden sind, soll es eine Rückmeldung mit dem Modulenamen geben.
Irgendwo habe ich mal etwas vom ExitCode gelesen. Zu dem würde ich jedoch gerne eine Meldung mitgeben, die ich dann in meinem Hauptscript verwenden kann. Wenn ich den Parameter LoadModule nicht verwende bzw. wenn er $false ist, möchte ich zu jedem Module erfahren, ob es vorhanden ist oder nicht.

Hast du dafür noch einen Tipp für mich?

Gruß
derhoeppi
Mitglied: 135333
135333 Jan 28, 2018 at 13:48:14 (UTC)
Goto Top
Mach aus dem $result ein leeres Array und dem fügst du dann customobjects mit dem Status hinzu, oder eine Hashtable mit den Statuswerten.