Ja, Powershell-Profile sind dot-sourced nach Design, denn das ist, was die Definitionen in ihnen enthaltenen erlaubt (Aliase, Funktionen, ...) zu sein global verfügbar standardmäßig - das ist schließlich der Hauptzweck der Profildateien.
Leider gibt es keinen Spielraum Modifikator, dass Sie einen temporären Raum für Variablen erstellen können Sie nur wollen existieren, während das Profil ist Laden - auch Umfang local
effektiv global in einem Profil Skript; In ähnlicher Weise ist die Verwendung des Bereichs private
auch keine Option, da der Skriptbereich des Profils - aufgrund der Punktquelle - der globale Bereich ist.
Generell Sie &
(der Anruf Operator) mit einem Skriptblock verwenden können Variablen innerhalb dieses Blockes zu erzeugen, die zu diesem Block scoped sind, aber das ist in der Regel im Widerspruch zu global verfügbaren Definitionen in einem Profil zu erstellen, zumindest standardmäßig.
Wenn Sie ein anderes Skript aufrufen, ohne es zu dot-sourcing, wie in Ihrer eigenen Antwort, werden seine Definitionen standardmäßig nicht global verfügbar gemacht. jedoch
Sie können, erstellen globale Elemente aus nicht -dot-sourced Skriptblöcke/script durch den globalen Bereich Angabe ausdrücklich; beispielsweise: & { $global:foo = 'Going global' }
oder & { function global:bar { 'global func' } }
.
Das heißt, die Logik hinter Dot-Sourcing-Profile ist wahrscheinlich, dass es einfacher ist, alle Definitionen global standardmäßig zu machen, die Definition von typischen Elemente eines Profils zu machen - Aliase, Funktionen, Laufwerkszuordnungen, Laden von Modulen - einfacher (es muss kein expliziter Bereich angegeben werden).
Im Gegensatz dazu sind globale Variablen weniger typisch, und um die oben aufgeführten typischen Elemente zu definieren, benötigen Sie normalerweise keine Variablen auf Skript-Ebene (und somit global) in Ihrem Profil.
Wenn Sie noch (Konzept) temporäre Variablen in Ihrem Profil zu erstellen (die nicht ist eine Voraussetzung für die global verfügbare Aliase erstellen, Funktionen, ...):
A einfache Abhilfe ist Verwenden Sie einen exotischen Variablennamen Präfix wie __
innerhalb des Profilskripts, um das Risiko zu reduzieren, dass sie durch einen Unfall referenziert werden (z. B. $__profileVar1 = ...
).
Mit anderen Worten: die Variablen noch existieren weltweit, aber ihre exotischen Namen werden in der Regel keine Probleme verursachen.
jedoch Ihr Ansatz, auch wenn es ein wenig zusätzliche Arbeit erfordert, klingt wie eine robuste Abhilfe, hier ist, wie es in voller aussieht (mit PSV3 + Syntax):
# Save a snapshot of current variables.
# * If there are variables that you DO want to exist globally,
# define them ABOVE this command.
# * Also, load MODULE and dot-source OTHER SCRIPTS ABOVE this command,
# because they may create variables that *should* be available globally.
$varsBefore = (Get-Variable).Name
# ... define and use temporary variables
# Remove all variables that were created since the
# snapshot was taken, including $varsBefore.
Remove-Variable (Compare-Object $varsBefore (Get-Variable).Name).InputObject
Beachten Sie, dass ich verlasse mich auf Compare-Object
‚s Standardverhalten von nur Unterschiede Berichterstattung zwischen Objekten und, vorausgesetzt, Sie haben nicht versucht, alle Variablen entfernen, nur die Variablen hinzugefügt sind re portiert.
Beachten Sie, dass, während es aus dem tatsächlichen Verhalten der Profildateien geschlossen werden kann, dass sie in der Tat punkt bezogen sind - vorausgesetzt, dass Dot-Sourcing ist die einzige Art und Weise Elemente auf den aktuellen Bereich hinzuzufügen (die globale Geltungsbereich, im Falle von Profilen) - diese Tatsache ist nicht explizit dokumentiert als solche.
Hier sind Auszüge aus verschiedenen Hilfethemen (Stand pSV5), die Hinweise darauf geben (Hervorhebung von mir):
Von Get-Help about_Profiles
:
Ein Windows Powershell-Profil ist ein Skript, das ausgeführt wird, wenn Windows Powershell beginnt. Sie können das Profil als Anmeldeskript verwenden, um die -Umgebung anzupassen. Sie können Befehle, Aliase, Funktionen, Variablen, Snap-Ins, Module und Windows PowerShell-Laufwerke hinzufügen. Sie können Ihrem Profil auch andere sitzungsspezifische Elemente hinzufügen, sodass sie in jeder Sitzung verfügbar sind, ohne sie importieren oder neu erstellen zu müssen.
Von Get-Help about_Variables
:
sind standardmäßig Variablen nur in dem Umfang, in dem sie erstellt werden.
Zum Beispiel ist eine Variable, die Sie in einer Funktion erstellen, nur innerhalb der Funktion verfügbar. Eine Variable, die Sie in einem Skript erstellen, ist nur innerhalb des Skripts verfügbar (, es sei denn Sie dot-source das Skript, das es zum aktuellen Gültigkeitsbereich hinzufügt).
Von Get-Help about_Operators
:
. Dot-Sourcing-Operator Führt ein Skript im aktuellen Bereich aus, sodass alle Funktionen, Aliase und Variablen, die das Skript erstellt, zum aktuellen Bereich hinzugefügt werden.
Von Get-Help about_Scopes
Aber können Sie ein Skript oder Funktion auf den aktuellen Bereich hinzufügen, indem Punkt Quelle Notation. Wenn ein Skript im aktuellen Bereich ausgeführt wird, sind Funktionen, Aliasnamen und Variablen, die das Skript erstellt, im aktuellen Gültigkeitsbereich verfügbar.
Um dem aktuellen Bereich eine Funktion hinzuzufügen, geben Sie einen Punkt (.) Und ein Leerzeichen vor den Pfad und den Namen der Funktion im Funktionsaufruf ein.
Ich bin mir Ihres Ziels nicht sicher. Warum legen Sie die Gültigkeitsbereiche der Variablen auf "script" fest? –
@Bill_Stewart: Die Absicht besteht darin, temporäre Variablen innerhalb des Profils zu verwenden, die nicht länger verweilen sollten, sobald das Profil geladen wurde. – mklement0
Ah. Ja, PowerShell-Profile sind dot-sourcing. –