2009-02-19 5 views
36

Desidero ricaricare il mio profilo utente da un file di script. Ho pensato che puntino approvvigionamento dall'interno del file di script farebbe il trucco, ma non funziona:Come ricaricare il profilo utente dal file di script in PowerShell

# file.ps1 
. $PROFILE

Tuttavia, esso funziona se ho puntini sulle fonte da interprete di PowerShell.

Perché voglio farlo?

Eseguo questo script ogni volta che aggiorno il mio profilo e voglio testarlo, quindi mi piacerebbe evitare di dover riavviare PowerShell per aggiornare l'ambiente.

+1

'. $ profile' funziona come previsto senza complicarsi eccessivamente con le funzioni personalizzate. – leonarth

+0

@Leonard '. $ profile' dovrebbe essere la risposta accettata –

risposta

20

Quindi, l'approccio che hai contrassegnato come risposta potrebbe funzionare all'interno del prompt dei comandi di PowerShell, ma non funziona all'interno di PowerShell ISE (che, per me, fornisce una sessione PowerShell superiore) e probabilmente non funzionerà correttamente in altri ambienti PowerShell.

Ecco uno script che uso da un po 'e che ha funzionato molto bene per me in ogni ambiente. Ho semplicemente messo questa funzione nel mio Profile.ps1 a ~ \ Documenti \ WindowsPowerShell, e ogni volta che voglio ricaricare il mio profilo, ho DOT-fonte la funzione, vale a dire

. Reload-Profile 

Ecco la funzione:

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

Come ricarichi il tuo profilo la prima volta? :) –

+0

"ma non funziona all'interno di PowerShell ISE (che, per me, fornisce una sessione PowerShell superiore) e probabilmente non funzionerà correttamente in altri ambienti PowerShell." forse puoi spiegare perché non funziona, dal momento che ISE intende fornire parità con PowerShell. È anche difficile trovare motivi per utilizzare PowerShell su ISE, quindi sarebbe bello saperlo. – Blake

3

Perché stai provando a farlo?

Perché è probabile che crei duplicati (accoda a $ env: percorso) e problemi con l'impostazione di oggetti costante/readonly che causano errori.

C'è stato un thread su questo argomento di recente su microsoft.public.windows.powershell.

Se si sta tentando di ripristinare lo stato della sessione, non è possibile farlo, anche utilizzando un ambito interno ($host.EnterNestedPrompt()) a causa della possibilità di impostare variabili/alias/... su "tutto l'ambito".

+0

Potresti per favore collegare a detto post? Grazie! – guillermooo

+0

Aggiunto quello che penso sia il link giusto. – Richard

2

ho trovato questa soluzione:

#some-script.ps1 

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

Una versione più elaborata:

#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

Se si vuole globalmente aggiornare il vostro profilo da uno script, si dovrà eseguire lo script "DOT- provenienza".

Quando si esegue lo script, tutto lo script del profilo viene eseguito in un ambito "script" e non modificherà l'ambito "globale".

Affinché uno script possa modificare l'ambito globale, deve essere "dot-source" o preceduto da un punto.

. ./yourrestartscript.ps1 

dove hai il tuo profilo script "dot-sourced" all'interno di "yourrestartscript.ps1". Quello che stai facendo in realtà sta dicendo "yourrestartscript" per l'esecuzione nel scope corrente e all'interno di quello script, stai dicendo allo script $ profile di essere eseguito nello scope dello script. Poiché l'ambito dello script è l'ambito globale, tutte le variabili impostate o i comandi nel tuo profilo si verificheranno nell'ambito globale.

che non ti compra molto vantaggio rispetto esecuzione

. $profile 
+0

@Steven: Se metto. $ PROFILE nello script stesso, non funziona ... Questo è quello che sto cercando di fare. – guillermooo

+0

Non è vero? $ ProfiloUtente? –

+0

@scott $ profile è il percorso completo del profilo specifico della shell. –

0

Questo è solo un perfezionamento dello script due linee in risposta guillermooo cui sopra, che non ha ottenuto la nuova finestra di PowerShell nella directory corretta per me . Credo che questo sia dovuto al fatto che $ PWD viene valutato nel contesto della nuova finestra di PowerShell, che non è il valore che vogliamo che set-location venga elaborato.

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

Con i diritti non dovrebbe funzionare, come la linea di comando sputa fuori è corretto, ma sembra di fare il lavoro e che è abbastanza buono per me.

3
& $profile 

funziona per ricaricare il profilo.

Se il profilo imposta alias o esegue le importazioni che non riescono, verranno visualizzati errori poiché erano già stati impostati nel caricamento precedente del profilo.

+1

Per qualche motivo questo non funziona con le funzioni appena definite –

Problemi correlati