active - crear usuarios en powershell
Cómo volver a cargar el perfil de usuario desde el archivo de script en PowerShell (7)
¿Por qué estás tratando de hacer esto?
Porque es probable que cree duplicados (se agrega a $ env: ruta) y problemas con la configuración de objetos constantes / de solo lectura que causan errores.
Hubo un hilo sobre este tema recientemente en microsoft.public.windows.powershell .
Si intenta restablecer el estado de la sesión, no hay forma de hacerlo, incluso utilizando un alcance interno ( $host.EnterNestedPrompt()
) debido a la capacidad de establecer variables / alias / ... en "all scope" .
Quiero volver a cargar mi perfil de usuario desde un archivo de script. Pensé que el dot sourcing desde el archivo de script haría el truco, pero no funciona:
# file.ps1
. $PROFILE
Sin embargo, funciona si obtengo un código fuente del 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.
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
Entonces, 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í, brinda una sesión superior de PowerShell) y probablemente no funcionará 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 coloco esta función en mi Profile.ps1 en ~ / Documents / WindowsPowerShell, y cada vez que quiero volver a cargar mi perfil, dot-source 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 $_"
. $_
}
}
}
Esto es solo un refinamiento del guión de dos líneas en la respuesta de guillermooo anterior, que no obtuvo 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 no debería funcionar, ya que la línea de comando que escupe está mal formada, pero parece hacer el trabajo y eso es suficiente para mí.
Si desea actualizar globalmente su perfil a partir de un script, deberá ejecutar ese script "dot-sourced".
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 modifique su alcance global, debe ser "dot-source" o precedida por un punto.
. ./yourrestartscript.ps1
donde tiene su script de perfil "dot-sourced" 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.
Eso no te compra mucha ventaja sobre correr
. $profile
ya que me encontré con esto varios años después, pensé en agregar que puede usar el operador de invocación: &
para cargar su perfil con la variable predeterminada a su perfil: $profile
.
entonces, si tu sesión de alguna manera falla al cargar tu perfil (me pasa con cmder / conemu) simplemente escribe:
& $profile
& $profile
funciona para volver a cargar el perfil
Si su perfil establece alias o ejecuta importaciones que fallan, verá errores porque ya fueron configurados en la carga anterior del perfil.