2009-02-19 25 views
36

Chcę ponownie załadować mój profil użytkownika z pliku skryptu. Myślałam, że kropkę Sourcing go od wewnątrz pliku skryptu by rade, ale to nie działa:Jak ponownie załadować profil użytkownika z pliku skryptu w PowerShell

# file.ps1 
. $PROFILE

Jednak to nie działa, jeśli dot zaopatrywać go od tłumacza w PowerShell.

Dlaczego chcę to zrobić?

Uruchamiam ten skrypt za każdym razem, gdy aktualizuję swój profil i chcę go przetestować, dlatego chciałbym uniknąć konieczności ponownego uruchomienia PowerShell w celu odświeżenia środowiska.

+1

'. $ profile' działa zgodnie z przeznaczeniem, nie ma potrzeby nadmiernego komplikowania z funkcjami niestandardowymi. – leonarth

+0

@Leonard '. $ profile' powinno być zaakceptowaną odpowiedzią –

Odpowiedz

20

Podejście, które zostało oznaczone jako odpowiedź, może działać w wierszu polecenia Powershell, ale nie działa w programie PowerShell ISE (co, dla mnie, zapewnia lepszą sesję PowerShell) i prawdopodobnie nie będzie działać poprawnie w innych środowiskach PowerShell.

Oto skrypt, którego używam od jakiegoś czasu i działa bardzo dobrze w każdym środowisku. I po prostu umieścić tę funkcję do mojego Profile.ps1 w ~ \ Documents \ WindowsPowerShell, a gdy chcę odświeżyć mój profil, I kropka-source funkcję, tj

. Reload-Profile 

Oto funkcja:

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

Jak ponownie załadować swój profil za pierwszym razem? :) –

+0

"ale to nie działa w środowisku PowerShell ISE (które, dla mnie, zapewnia doskonałą sesję PowerShell) i prawdopodobnie nie będzie działać poprawnie w innych środowiskach PowerShell." być może możesz wyjaśnić, dlaczego to nie działa, ponieważ ISE ma zapewnić parzystość z powershell. Trudno też znaleźć powody, by używać PowerShell na ISE, więc byłoby miło wiedzieć. – Blake

3

Dlaczego próbujesz to zrobić?

Ponieważ jest prawdopodobne, aby tworzyć duplikaty (dołącza do $ env: path) oraz problemy z ustawieniem Stała/tylko do odczytu obiektów powodujących błędy.

Było wątek na ten temat niedawno na microsoft.public.windows.powershell.

Jeśli próbujesz zresetować stan sesji, nie można tego zrobić, nawet używając wewnętrznego zakresu ($host.EnterNestedPrompt()) z powodu możliwości ustawienia zmiennych/aliasów/... w "całym zakresie".

+0

Czy możesz zamieścić link do tego postu? Dzięki! – guillermooo

+0

Dodano to, co uważam za odpowiedni link. – Richard

2

Znalazłem rozwiązania:

#some-script.ps1 

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

bardziej rozbudowany wersja:

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

Jeśli chcesz globalnie odświeżyć swój profil ze skryptu, trzeba będzie uruchomić ten skrypt „punktowych pozyskiwany ".

Po uruchomieniu skryptu, cały skrypt profil działa w „skrypt” zakres i nie będą modyfikować swój „globalny” zakresu.

Aby skrypt zmodyfikować zasięg globalny, to musi być „kropka-source” lub poprzedzone kropką.

. ./yourrestartscript.ps1 

gdzie masz swój skrypt profilu "dot-sourced" wewnątrz "yourrestartscript.ps1". To, co faktycznie robisz, to mówienie "yourrestartscript" do uruchomienia w bieżącym zakresie i wewnątrz tego skryptu, mówisz skryptowi $ profile, aby działał w zakresie skryptu. Ponieważ zakres skryptu jest zasięgiem globalnym, wszystkie zmienne ustawione lub polecenia w twoim profilu będą miały zasięg globalny.

To nie kupić ci dużo przewagi nad systemem

. $profile 
+0

@Steven: Jeśli dodam. $ PROFILE w samym skrypcie, to nie działa ... To właśnie próbuję zrobić. – guillermooo

+0

Czy to nie to. $ UserProfile? –

+0

@ scott $ profile to pełna ścieżka do określonego profilu powłoki. –

0

To tylko udoskonalenie skrypcie dwóch linii w odpowiedzi guillermooo jest powyżej, który nie dostał nowe okno PowerShell do odpowiedniego katalogu dla mnie . Sądzę, że dzieje się tak dlatego, że $ PWD jest oceniany w nowym kontekście okna PowerShell, który nie jest wartością, której chcemy przetwarzać.

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

Według prawa nie powinny pracować, jak w wierszu poleceń to wypluwa jest uszkodzony, ale wydaje się, aby wykonać zadanie i to mi wystarczy.

3
& $profile 

działa, aby ponownie załadować profil.

Jeśli Twój profil ustawi aliasy lub wykona import, który się nie powiedzie, pojawią się błędy, ponieważ zostały już ustawione w poprzednim wczytaniu profilu.

+1

Z jakiegoś powodu nie działa to w przypadku nowo zdefiniowanych funkcji –

Powiązane problemy