Frage

Ich möchte mein Benutzerprofil aus einer Skriptdatei neu laden.Ich dachte, dass es ausreichen würde, es direkt aus der Skriptdatei zu beziehen, aber es funktioniert nicht:

# file.ps1
. $PROFILE

Es funktioniert jedoch, wenn ich es aus dem PowerShell-Interpreter quelle.

Warum möchte 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, PowerShell neu starten zu müssen, um die Umgebung zu aktualisieren.

War es hilfreich?

Lösung

So ist der Ansatz, den Sie als die Antwort markiert kann innerhalb der Powershell-Eingabeaufforderung arbeiten, aber es funktioniert nicht innerhalb Powershell ISE (was bietet mir eine hervorragende Powershell-Sitzung) und wird wahrscheinlich nicht richtig arbeiten in andere Powershell-Umgebungen.

Hier ist ein Skript, das ich für eine Weile verwendet haben, und es hat sich in jeder Umgebung sehr gut für mich gearbeitet. Ich habe einfach diese Funktion setzen in mein Profile.ps1 bei ~ \ Dokumente \ Windows, und wann immer ich will, mein Profil laden, ich dot-Quelle die Funktion, d.

. Reload-Profile

Hier ist die Funktion:

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

Andere Tipps

Wenn Sie Ihr Profil aktualisieren, um global zu wollen aus einem Skript, werden Sie ausführen müssen, um das Skript „dot-sourced“.

Wenn Sie Ihren Skript ausführen, die ganze Profil Skript läuft in einem „Skript“ Umfang und Ihren „global“ scope nicht ändern.

für einen Skript Um Ihren globalen Bereich zu ändern, braucht es „Punktquelle“ oder mit einer Periode voraus zu sein.

. ./yourrestartscript.ps1

, wo Sie Ihr Profil Skript „dot-sourced“ innerhalb von „yourrestartscript.ps1“ haben. Was Sie eigentlich tun „yourrestartscript“ erzählt im aktuellen Bereich laufen und innerhalb dieses Skript, werden Sie die $ Profil Skript erzählt in das Skript des Umfangs auszuführen. Da der Anwendungsbereich des Skripts die globale Reichweite ist, stellen alle Variablen oder Befehle in Ihrem Profil im globalen Bereich passieren wird.

Das macht man nicht kaufen viel Vorteil gegenüber ausgeführt

. $profile
& $profile   

funktioniert das Profil neu zu laden.

Wenn Sie Ihr Profil setzt Aliase oder führt Einfuhren, die scheitern, dann werden Sie Fehler sehen, weil sie bereits in der vorherigen Laden des Profils festgelegt wurden.

Warum versuchen Sie das?

Weil es wahrscheinlich zu Duplikaten kommt (wird an $env:path angehängt) und es zu Problemen beim Festlegen von konstanten/schreibgeschützten Objekten kommt, die zu Fehlern führen.

Zu diesem Thema gab es kürzlich einen Thread hier 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 Bereich verwenden ($host.EnterNestedPrompt()) wegen der Möglichkeit, Variablen/Aliase/... festzulegenin „jedem Umfang“.

Ich fand diese Abhilfe:

#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 aufwendigere 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

Das ist nur eine Verfeinerung der zweizeilige Skript in guillermooo Antwort oben, das nicht mit den neuen Powershell-Fenster in das richtige Verzeichnis für mich bekommen hat. Ich glaube, das liegt daran, dass $ PWD in den neuen Powershell-Fenstern Kontext ausgewertet wird, die nicht der Wert wir Set-Standort bearbeiten wollen.

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

Durch Rechte sollte es nicht funktionieren, da die Befehlszeile spuckt es aus ist fehlerhaft, aber es scheint, die Arbeit zu tun, und das ist gut genug für mich.

ich dies überprüfen verwendet, welches Profil für immer nahm zu laden.

Start Run:

powershell_ise -noprofile

Dann lief ich dies:

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

Danke @Winston Fassett für immer mich näher mein Problem zu finden.

da ich auf diese mehr Jahre stolperte später, dachte ich hinzufügen, dass Sie den Aufruf Operator verwenden: & Ihr Profil mit dem Standard-Variable auf Ihr Profil zu laden. $profile

so, wenn die Sitzung nicht irgendwie dein Profil laden (passiert mir mit cmder / conemu) geben Sie einfach:

& $profile

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top