2009-02-19 28 views
36

Quiero volver a cargar mi perfil de usuario desde un archivo de script. Pensé que puntos de abastecimiento desde dentro del archivo de script que hacer el truco, pero no funciona:Cómo volver a cargar el perfil de usuario desde el archivo de script en PowerShell

# file.ps1 
. $PROFILE

Sin embargo, funciona si punteo fuente él desde el intérprete de PowerShell.

¿Por qué quiero hacer esto?

Ejecuto este script cada vez que actualizo mi perfil y quiero probarlo, así que me gustaría evitar tener que reiniciar PowerShell para actualizar el entorno.

+1

'. $ profile' funciona según lo previsto sin necesidad de complicar demasiado con funciones personalizadas. – leonarth

+0

@Leonard '. $ profile' debe ser la respuesta aceptada –

Respuesta

20

Por lo tanto, el enfoque que marcó como respuesta puede funcionar dentro del símbolo del sistema de Powershell, pero no funciona dentro de PowerShell ISE (que, para mí, proporciona una sesión superior de PowerShell) y probablemente no funcione correctamente en otros entornos de PowerShell.

Aquí hay un script que he estado usando por un tiempo, y me ha funcionado muy bien en todos los entornos. Simplemente ponga esta función en mi Profile.ps1 en ~ \ documentos \ WindowsPowerShell, y siempre que lo desee para recargar mi perfil, punto-fuente de la función, es decir,

. Reload-Profile 

Aquí está la función:

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

¿Cómo recargar su perfil la primera vez? :) –

+0

"pero no funciona dentro de PowerShell ISE (que, para mí, proporciona una sesión superior de PowerShell) y probablemente no funcionará en otros entornos de PowerShell". quizás pueda explicar por qué no funciona, ya que ISE pretende proporcionar paridad con powershell. También es difícil encontrar razones para usar powershell sobre ISE, por lo que sería bueno saberlo. – Blake

3

¿Por qué intentas hacer esto?

Debido a que es probable que crear duplicados (anexa a $ env: path) y problemas con la configuración de los objetos de sólo lectura/constantes que causan errores.

Hubo un hilo sobre este tema recientemente en microsoft.public.windows.powershell.

Si está intentando restablecer el estado de la sesión, no hay forma de hacerlo, incluso utilizando un ámbito interno ($host.EnterNestedPrompt()) debido a la capacidad de establecer variables/alias/... en "all scope".

+0

¿Podría enlazar a dicha publicación? ¡Gracias! – guillermooo

+0

Agregué lo que creo que es el enlace correcto. – Richard

2

me encontré con esta solución:

#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 versión más elaborada:

#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

Si desea actualizar su perfil globalmente a partir de una secuencia de comandos, tendrá que ejecutar el guión "punto- de origen ".

Cuando ejecuta su secuencia de comandos, todo el script de perfil se ejecuta en un ámbito de "secuencia de comandos" y no modificará su alcance "global".

Para que una secuencia de comandos para modificar su alcance global, es necesario que haya "punto-fuente" o precedido de un período.

. ./yourrestartscript.ps1 

donde tiene su script de perfil "punto de origen" dentro de "yourrestartscript.ps1". Lo que realmente está haciendo es decirle a "yourrestartscript" que se ejecute en el alcance actual y dentro de ese script, le está diciendo al script $ profile que se ejecute en el alcance del script. Como el alcance del guión es el alcance global, cualquier variable establecida o comando en su perfil ocurrirá en el ámbito global.

que no le compre mucha ventaja sobre el funcionamiento

. $profile 
+0

@Steven: Si lo puse. $ PROFILE en el script en sí, no funciona ... Eso es lo que trato de hacer. – guillermooo

+0

¿No es así? $ UserProfile? –

+0

@scott $ profile es la ruta completa al perfil específico de shell. –

0

Esto es sólo un refinamiento de la escritura de dos líneas en la respuesta de guillermooo arriba, que no recibieron la nueva ventana de PowerShell en el directorio correcto para mí . Creo que esto se debe a que $ PWD se evalúa en el nuevo contexto de la ventana de PowerShell, que no es el valor que queremos que set-location procese.

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

Por derecho para que no funcione, ya que la línea de comandos que escupe es incorrecto, pero parece que para hacer el trabajo, y eso es suficiente para mí.

3
& $profile 

funciona para volver a cargar el perfil.

Si su perfil establece alias o ejecuta importaciones que fallan, entonces verá errores porque ya fueron configurados en la carga anterior del perfil.

+1

Por alguna razón, esto no funciona con funciones recién definidas –

Cuestiones relacionadas