37 votos

Cómo volver a cargar el perfil de usuario del archivo de secuencia de comandos en PowerShell

Quiero recargar mi perfil de usuario desde un archivo de secuencia de comandos. Pensé que el punto de suministro desde dentro el archivo de secuencia de comandos que hacer el truco, pero no funciona:

# file.ps1
. $PROFILE

Sin embargo, no funciona si punto de origen de PowerShell del intérprete.

¿Por qué quiero hacer esto?

Puedo ejecutar esta secuencia de comandos cada vez que puedo actualizar mi perfil y quieres probarlo, así que me gustaría evitar tener que reiniciar PowerShell para refrescar el ambiente.

28voto

Steven Murawski Puntos 6665

Si desea globalmente la actualización de su perfil a partir de una secuencia de comandos, usted tendrá que ejecutar el script "punto de origen".

Cuando se ejecuta la secuencia de comandos, todo el perfil de la secuencia de comandos se ejecuta en un "script" ámbito de aplicación y no va a modificar su "global" ámbito de aplicación.

Para que una secuencia de comandos para modificar su alcance global, que tiene que ser "punto de origen" o precedida de un período.

. ./yourrestartscript.ps1

donde tienes tu perfil de secuencia de comandos "punto de origen" dentro de "yourrestartscript.ps1". Lo que está haciendo en realidad está diciendo "yourrestartscript" para que se ejecute en el ámbito actual y dentro de ese script, le está diciendo a los $perfil de secuencia de comandos para ejecutar en el guión de su ámbito. Desde la secuencia de comandos de su ámbito de aplicación es el ámbito global, cualquier conjunto de variables de comandos o en su perfil que va a suceder en el ámbito global.

Que no te compren una gran ventaja respecto a la ejecución de

. $profile

27voto

Winston Fassett Puntos 1810

Así, el enfoque que ha marcado como la respuesta puede trabajar en el símbolo del sistema de Powershell, pero no funciona en el interior de PowerShell ISE (que, para mí, proporciona una superior sesión de PowerShell) y que probablemente no funcione bien en otros PowerShell entornos.

He aquí un script que he estado usando durante un tiempo, y se ha trabajado muy bien para mí, en cada ambiente. Yo simplemente poner esta función en mi Perfil.ps1 en ~\mis Documentos\WindowsPowerShell, y cada vez que quiero cargar mi perfil, yo de punto de origen 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 $_"
            . $_
        }
    }    
}

3voto

Richard Puntos 54016

Por qué estás tratando de hacer esto?

Porque es probable que crear duplicados (anexa a $env:ruta de acceso) y problemas con la configuración de la constante/readonly objetos que causan errores.

Había un hilo sobre este tema recientemente en microsoft.público.windows.powershell.

Si usted está tratando de restablecer el estado de la sesión no hay ninguna forma de hacerlo, incluso mediante el uso de un interior de alcance ($host.EnterNestedPrompt()) debido a la capacidad de establecer las variables/alias/... en "todo ámbito".

2voto

guillermooo Puntos 2711

Encontré 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

0voto

Alex Puntos 419

Este es sólo un refinamiento de las dos de la línea de comandos en guillermooo la respuesta de arriba, que no se obtiene la nueva ventana de PowerShell en el directorio correcto para mí. Creo que es porque $PWD se evalúa en la nueva ventana de PowerShell del contexto, que no es el valor que queremos fijar-ubicación de proceso.

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

Por los derechos no se debe trabajar, como la línea de comando que se escupe es incorrecto, pero parece que para hacer el trabajo y eso es suficiente para mí.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: