sourcecode

종료하지 않고 PowerShell 세션 새로 고침/다시 시작

copyscript 2023. 10. 21. 10:40
반응형

종료하지 않고 PowerShell 세션 새로 고침/다시 시작

PowerShell 프로필의 일부 스크립트를 수정했는데 powershell을 종료한 후 다시 시작하는 것이 귀찮아져서 프로필의 스크립트에 변경 사항이 로드됩니다.종료하지 않고 파워셸 세션을 다시 시작할 수 있습니까?

그냥 하면 됩니다.. $profile프로파일을 다시 수집할 수 있습니다.

그러면 같은 콘솔 창에서 새 세션이 시작되고 프로필이 다시 로드됩니다.

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 }

물론 이전 세션의 변수 등을 모두 잃게 됩니다.

참고: 이와 같이 같은 창에서 새 세션을 생성하면 상위 프로세스가 백그라운드에서 실행됩니다.일반적으로 창이 닫히면 부모(및 다른 조상)가 종료되므로 문제가 되지 않습니다.그러나 이 문제가 우려되는 경우 프로필에 다음과 같은 내용을 추가할 수 있습니다.

$p = Get-Process -Id $PID
If ($p.Parent.Name -eq $p.Name -and !($p.MainWindowTitle))
{
    Stop-Process -Id $p.Parent.Id -Force
}

@manojlds의 대답은 맞지만 결국 오류를 던질 수도 있습니다.예를 들어 프로필에 새 PSD 드라이브를 정의한 경우 다시 소싱하면 오류가 발생할 수 있습니다.

다른 접근 방식은 먼저 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 host 명령(기본적으로 PS에서는 사용할 수 없음)을 의도한 것이라면, 이 명령을 실행할 수 있습니다.

@Bad의 답변에 대한 확장 내용입니다.이제 ISE를 처리합니다(항상 사용하기 때문에).

ISE에 있으면 ISE가 재시작됩니다.일반 PowerShell에 있으면 일반 PowerShell을 다시 시작합니다.Get-PSHostProcessInfoISE 실행 여부를 확인할 수 있는 현재 PowerShell 세션에 대한 정보를 반환합니다.

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

profile.ps1을 .심플타입reload다시 로드/재시작하기만 하면 됩니다.

function reload-Console {
    clear
    Write-Host "Reload Console"
    Get-Process -Id $PID | Select-Object -ExpandProperty Path | ForEach-Object { Invoke-Command { & "$_" } -NoNewScope }
}
New-Alias reload reload-Console

manojlds의 답변(현재 최고 등급의 답변)은 프로필이 무엇을 하는지에 따라 문제가 있을 수 있습니다(본질적으로 깨끗한 슬레이트에 따라 시작하는 것이 결정되는 경우).하지만 가장 큰 문제는 앨리어싱이 가능한 기능에 넣기가 쉽지 않다는 것이라고 생각합니다.

그래서, 저는 nmbell의 답변과 비슷한 것을 선호하지만, 훨씬 간단합니다.

function Reset-Session {
    # store this shell's parent PID for later use
    $parentPID = $PID
    # get the the path of this shell's executable
    $thisExePath = (Get-Process -Id $PID).Path
    # start a new shell, same window
    Start-Process $thisExePath -NoNewWindow
    # stop this shell if it's still alive
    Stop-Process -Id $parentPID -Force
}
# optional
Set-Alias -Name reset -Value Reset-Session

리프레시네브

실행코드 예시

언급URL : https://stackoverflow.com/questions/11546069/refreshing-restarting-powershell-session-w-out-exiting

반응형