Session 正在刷新/重新启动PowerShell会话,但退出

Session 正在刷新/重新启动PowerShell会话,但退出,session,powershell,restart,Session,Powershell,Restart,我一直在调整我的PowerShell配置文件中的一些脚本,退出PowerShell然后重新启动会让人恼火,这样它就会加载我对我的配置文件中的脚本所做的任何更改。是否可以在不退出的情况下重新启动powershell会话?您只需执行$profile再次获取配置文件。@manojlds的答案是正确的,但最终可能会抛出错误。例如,如果您在配置文件中定义了一个新的PSDrive,则重新点源可能会导致错误 另一种方法是先启动powershell,然后通过键入powershell立即在内部启动另一个版本。我在

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

您只需执行
$profile
再次获取配置文件。

@manojlds的答案是正确的,但最终可能会抛出错误。例如,如果您在配置文件中定义了一个新的PSDrive,则重新点源可能会导致错误

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


另一件事-缓慢而小心地更改配置文件。在我看来,虽然档案确实需要演变,但这种演变通常应该是缓慢的。YMMV

您可以制作一个简单的函数并将其添加到您的
$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中不可用),那么它将完成工作…

以下是对@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
}

这将在同一控制台窗口中启动新会话,重新加载您的配置文件:

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 }

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

如果您正在更新的不是C:\Users\wombat\Documents\WindowsPowerShell\Microsoft.PowerShell\U profile.ps1,则术语“C:\Users\Documents\WindowsPowerShell\Microsoft.PowerShell\uProfile.ps1”不能识别为cmdlet的名称,函数、脚本文件或可操作程序。请检查名称的拼写,或者如果包含路径,请验证路径是否正确,然后重试。在第1行,字符数为2+。当你说你正在调整配置文件中的一些脚本时,你到底在调整什么文件?这不会以任何方式重置实际会话变量、加载的模块等。这将不会刷新会话。您定义的任何变量将仍然存在于以前的命令中。对于那些有兴趣尝试此功能的人,实际语法是
powershell()
功能是计划好的:这只适用于ISE
start powershell
是这里的真正答案,但是请注意,您将丢失窗口设置。要关闭旧的shell并启动新的shell类型“exit start powershell”,但正如Andrew所指出的,以前的设置不会预先显示。Get-PSHostProcessInfo返回当前运行的所有实例的信息,因此如果您从普通控制台对ISE调用它,则可能会出错。您可能会考虑改用$host.Name,它应该返回您正在使用的进程名称。类似于:
if((Get Process-id$pid).ProcessName.contains(“powershell_-ise”))…
,或者与此稍有不同:
if($host.Name-imatch“ise”)…
@RandallBorck感谢您的建议!如果您已测试此选项,则可以编辑我的答案。在PowerShell7(Windows终端)中使用此命令不会重新加载环境变量,将返回PowerShell5。@如果PowerShell 7的“确定”按钮,您需要使用。@如果在powershell和powershell集成控制台终端的VS代码中,_ok_按钮对我来说都很好……当我尝试此命令时(从编辑器中或粘贴到控制台中),它会“挂起”powershell ISE(即运行按钮变灰,停止按钮变红)。