【问题标题】:Refreshing/Restarting PowerShell session w/out exiting在不退出的情况下刷新/重新启动 PowerShell 会话
【发布时间】:2012-07-17 18:22:40
【问题描述】:

我一直在调整我的 PowerShell 配置文件中的一些脚本,退出 powershell 然后重新启动它很烦人,因此它会加载我对我的配置文件中的脚本所做的任何更改。是否可以在不退出的情况下重新启动 powershell 会话?

【问题讨论】:

标签: session powershell restart


【解决方案1】:

您可以通过 . $profile 再次获取配置文件。

【讨论】:

  • 如果您要更新 C:\Users\wombat\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1 以外的其他内容,请指定配置文件
  • 术语“C:\Users\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1”未被识别为 cmdlet、函数、脚本文件或可运行程序的名称。检查名称的拼写,或者如果包含路径,请验证路径是否正确并重试。在 line:1 char:2 + 。
  • 当您说您正在调整配置文件中的某些脚本时,您究竟在调整什么文件?
  • 这不会以任何方式重置实际会话变量、加载的模块等。
  • 这不会刷新会话。您定义的任何变量在之前的命令中仍然存在。
【解决方案2】:

@manojlds 的回答是正确的,但最终可能会引发错误。例如,如果您在个人资料中定义了一个新的 PSDrive,那么重新点源它可能会导致错误。

另一种方法是首先启动 powershell,然后通过键入 PowerShell 立即启动另一个版本。我在嵌套控制台中对我的配置文件进行了更改,退出,然后重新运行 PowerShell 以测试更新的配置文件。

另一件事 - 缓慢而谨慎地更改个人资料。在我看来,虽然配置文件确实需要发展,但这种发展通常应该是缓慢的。 YMMV!!

【讨论】:

  • 对于那些有兴趣尝试这个的人,实际语法是powershell(<yourcommandhere>)
【解决方案3】:

这将在同一个控制台窗口中启动一个新会话,重新加载您的个人资料:

Invoke-Command { & "powershell.exe" } -NoNewScope # PowerShell 5
Invoke-Command { & "pwsh.exe"       } -NoNewScope # PowerShell 7

或者更长但更健壮的命令,以下应该可以跨版本正常工作:

Get-Process -Id $PID | Select-Object -ExpandProperty Path | ForEach-Object { Invoke-Command { & "$_" } -NoNewScope }

当然,您会丢失前一会话中的所有变量等。

【讨论】:

  • 不重新加载环境变量
  • 在 PowerShell7(Windows 终端)中使用此命令将返回 PowerShell5。
  • @if_ok_button 对于 PowerShell 7,您需要使用 PowerShell 7 exe
  • @if_ok_button 在 Powershell 和 Powershell 集成控制台终端中的 VS Code 中对我来说效果很好......
  • 当我尝试此命令(从编辑器中或将其粘贴到控制台中)时,它会“挂起”PowerShell ISE(也就是运行按钮显示为灰色,停止按钮显示为红色)。
【解决方案4】:

您可以制作一个简单的函数并将其添加到您的$profile(或制作一个模块然后导入到'$profile'),例如:

function Restart-PowerShell{
    Start-Process PowerShell # Launch PowerShell host in new window
    exit # Exit existing PowerShell host window
}
# Add any alias if you want, for ex. rps (rp already occupied by "Remove-ItemProperty”)
Set-Alias -Name rps -Value Restart-PowerShell

注意:虽然这可能与您在问题“w/out exiting”的标题中所写的内容不完全相同,但如果实质上您的初衷是有某种重启 PowerShell 主机命令(这不是默认情况下在 PS 中可用)然后它将完成工作......

【讨论】:

  • start powershell 是真正的答案,但请注意您将丢失窗口设置。
  • 要关闭旧的 shell 并启动一个新的 shell 类型“exit start powershell”,但是正如 Andrew 所说,以前的设置不会存在。
【解决方案5】:

这是对@Bad 答案的扩展。这将处理 ISE(因为我一直使用它)。

这个想法是,如果您在 ISE 中,它将重新启动 ISE。如果您使用的是普通 PowerShell,它将重新启动普通 PowerShell。 Get-PSHostProcessInfo 返回有关当前 PowerShell 会话的信息,可让您确定您是否正在运行 ISE。

function Restart-PowerShell
{
    if((Get-PSHostProcessInfo).ProcessName.Contains('powershell_ise'))
    {
        Start-Process 'powershell_ise.exe'
    } else {
        Start-Process 'powershell.exe'
    }
    exit
}

【讨论】:

  • Get-PSHostProcessInfo 返回所有当前正在运行的实例的信息,因此如果您从普通控制台而不是 ISE 调用它,这可能是错误的。您可能会考虑改用 $host.Name ,它应该返回您正在使用的进程名称。类似:if ((Get-Process -id $pid).ProcessName.contains("powershell_ise"))...,或者有点不同:if ($host.Name -imatch "ise")...
  • @RandallBorck 感谢您的建议!如果您对此进行了测试,您可以编辑我的答案
猜你喜欢
  • 1970-01-01
  • 2020-12-23
  • 2021-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多