it-swarm.com.de

So laden Sie das Benutzerprofil aus der Skriptdatei in PowerShell neu

Ich möchte mein Benutzerprofil aus einer Skriptdatei neu laden. Ich dachte, dass Punktbeschaffung aus der Skriptdatei den Trick erfüllen würde, aber es funktioniert nicht:

# file.ps1
. $PROFILE

Es funktioniert jedoch, wenn ich es vom PowerShell-Interpreter besorge.

Warum will ich das tun?

Ich führe dieses Skript jedes Mal aus, wenn ich mein Profil aktualisiere und es testen möchte. Daher möchte ich vermeiden, dass PowerShell neu gestartet werden muss, um die Umgebung zu aktualisieren.

36
guillermooo

Der von Ihnen als Antwort markierte Ansatz funktioniert möglicherweise innerhalb der Powershell-Eingabeaufforderung, jedoch nicht innerhalb von PowerShell ISE (die für mich eine überlegene PowerShell-Sitzung bietet) und funktioniert in anderen PowerShell-Umgebungen wahrscheinlich nicht richtig .

Hier ist ein Skript, das ich seit einiger Zeit verwende, und es hat in jeder Umgebung sehr gut für mich funktioniert. Ich füge diese Funktion einfach in ~ ~ Documents\WindowsPowerShell in meinem Profile.ps1 ein, und wann immer ich mein Profil neu laden möchte, werde ich die Funktion dot-source, d. H.

. Reload-Profile

Hier ist die Funktion:

function Reload-Profile {
    @(
        $Profile.AllUsersAllHosts,
        $Profile.AllUsersCurrentHost,
        $Profile.CurrentUserAllHosts,
        $Profile.CurrentUserCurrentHost
    ) | % {
        if(Test-Path $_){
            Write-Verbose "Running $_"
            . $_
        }
    }    
}
23
Winston Fassett

Wenn Sie Ihr Profil global von einem Skript aus aktualisieren möchten, müssen Sie das Skript "dot-sourced" ausführen. 

Wenn Sie Ihr Skript ausführen, wird das gesamte Profilskript in einem Bereich "Skript" ausgeführt und ändert Ihren "globalen" Bereich nicht. 

Damit ein Skript Ihren globalen Gültigkeitsbereich ändern kann, muss es "Punktquelle" sein oder mit einem Punkt vorangestellt werden.

. ./yourrestartscript.ps1

wo Sie Ihr Profilskript "dot-sourced" in "yourrestartscript.ps1" haben. Was Sie tatsächlich tun, sagt "yourrestartscript" zur Ausführung im aktuellen Bereich und innerhalb dieses Skripts weisen Sie das $ profile-Skript an, im Skriptbereich ausgeführt zu werden. Da der Gültigkeitsbereich des Skripts der globale Gültigkeitsbereich ist, werden alle in Ihrem Profil festgelegten Variablen oder Befehle im globalen Gültigkeitsbereich ausgeführt.

Das bringt dir keinen Vorteil gegenüber dem Laufen

. $profile
28
Steven Murawski
& $profile   

funktioniert, um das Profil neu zu laden.

Wenn in Ihrem Profil Aliasnamen festgelegt oder Importe ausgeführt werden, die fehlschlagen, werden Fehler angezeigt, da diese bereits beim vorherigen Laden des Profils festgelegt wurden.

5
Lahru

Warum versuchst du das?

Es ist wahrscheinlich, dass Duplikate erstellt werden (hängt an $ env: path) und Probleme beim Setzen von konstanten/readonly-Objekten, die Fehler verursachen.

Vor kurzem gab es zu diesem Thema einen Thread zu Microsoft.public.windows.powershell .

Wenn Sie versuchen, den Status der Sitzung zurückzusetzen, gibt es keine Möglichkeit, dies zu tun, selbst wenn Sie einen inneren Gültigkeitsbereich ($Host.EnterNestedPrompt()) verwenden, da Sie Variablen/Aliases/... auf "all scope" setzen können.

3
Richard

Ich habe diese Problemumgehung gefunden:

#some-script.ps1

#restart profile (open new powershell session)
cmd.exe /c start powershell.exe -c { Set-Location $PWD } -NoExit
Stop-Process -Id $PID

Eine ausführlichere Version:

#publish.ps1
# Copy profile files to PowerShell user profile folder and restart PowerShell
# to reflect changes. Try to start from .lnk in the Start Menu or
# fallback to cmd.exe.
# We try the .lnk first because it can have environmental data attached
# to it like fonts, colors, etc.

[System.Reflection.Assembly]::LoadWithPartialName("System.Diagnostics")

$dest = Split-Path $PROFILE -Parent
Copy-Item "*.ps1" $dest -Confirm -Exclude "publish.ps1" 

# 1) Get .lnk to PowerShell
# Locale's Start Menu name?...
$SM = [System.Environment+SpecialFolder]::StartMenu
$CurrentUserStartMenuPath = $([System.Environment]::GetFolderPath($SM))
$StartMenuName = Split-Path $CurrentUserStartMenuPath -Leaf                                 

# Common Start Menu path?...
$CAD = [System.Environment+SpecialFolder]::CommonApplicationData
$allUsersPath = Split-Path $([System.Environment]::GetFolderPath($CAD)) -Parent
$AllUsersStartMenuPath = Join-Path $allUsersPath $StartMenuName

$PSLnkPath = @(Get-ChildItem $AllUsersStartMenuPath, $CurrentUserStartMenuPath `
                                        -Recurse -Include "Windows PowerShell.lnk")

# 2) Restart...
# Is PowerShell available in PATH?
if ( Get-Command "powershell.exe" -ErrorAction SilentlyContinue ) {

    if ($PSLnkPath) {

        $pi = New-Object "System.Diagnostics.ProcessStartInfo"
        $pi.FileName = $PSLnkPath[0]
        $pi.UseShellExecute = $true

        # See "powershell -help" for info on -Command
        $pi.Arguments = "-NoExit -Command Set-Location $PWD"

        [System.Diagnostics.Process]::Start($pi)
    }
    else { 

        # See "powershell -help" for info on -Command
        cmd.exe /c start powershell.exe -Command { Set-Location $PWD } -NoExit
    }
}
else {
    Write-Host -ForegroundColor RED "Powershell not available in PATH."
}

# Let's clean up after ourselves...
Stop-Process -Id $PID
2
guillermooo

Dies ist nur eine Verfeinerung des zweizeiligen Skripts in der obigen Antwort von guillermooo, das das neue PowerShell-Fenster nicht in das richtige Verzeichnis für mich brachte. Ich glaube, das liegt daran, dass $ PWD im Kontext des neuen PowerShell-Fensters ausgewertet wird. Dies ist nicht der Wert, den set-location verarbeiten soll.

function Restart-Ps {
$cline = "`"/c start powershell.exe -noexit -c `"Set-Location '{0}'" -f $PWD.path
cmd $cline
Stop-Process -Id $PID
}

Von Rechts wegen sollte es nicht funktionieren, da die Befehlszeile, die es ausspuckt, fehlerhaft ist, aber es scheint den Job zu erledigen und das ist gut genug für mich.

0
Alex

da ich einige Jahre später darauf gestoßen bin, dachte ich, hinzuzufügen, dass Sie den Aufrufoperator verwenden können: &, um Ihr Profil mit der Standardvariablen in Ihr Profil zu laden: $profile.

wenn also Ihre Sitzung das Profil nicht laden kann (passiert mir mit cmder/conemu), geben Sie einfach Folgendes ein:

& $profile

0
Dan W. Link

Ich habe dies verwendet, um zu beheben, welches Profil für das Laden ewig gedauert hat.

Starte den Lauf:

powershell_ise -noprofile

Dann habe ich folgendes ausgeführt:

function Reload-Profile {
    @(
        $Profile.AllUsersAllHosts,
        $Profile.AllUsersCurrentHost,
        $Profile.CurrentUserAllHosts,
        $Profile.CurrentUserCurrentHost
    ) | % {
        if(Test-Path $_){
            Write-Verbose "Running $_"
            $measure = Measure-Command {. $_}
            "$($measure.TotalSeconds) for $_"
        }
    }    
}

. Reload-Profile

Vielen Dank an @ Winston Fassett, dass Sie mir die Suche nach meinem Problem näher gebracht haben.

0
Omzig