PowerShell 버전 확인: 최상의 실행 방법

PowerShell에서는 똑같은 작업을 수행하는 방법이 엄청나게 많습니다 (또는 거의 비슷합니다). 이 블로그 글에서는 로컬 및 원격 컴퓨터에 있는 PowerShell 버전을 확인하는 모든 방법을 배우게 될 것입니다. 나쁜 방법과 내가 추천하는 방법을 다룰 것입니다.

PowerShell 버전을 확인하는 다양한 방법을 보여주는 웹사이트가 있지만, 그 중에 모든 방법을 종합적으로 정리한 곳은 없습니다. 그것을 바꾸기로 결정했습니다.

이 모든 방법은 Windows PowerShell과 PowerShell Core에서 모두 작동해야 합니다. 이 방법들은 또한 Windows PowerShell 버전 1.0부터 PowerShell 7까지도 작동해야 합니다.

실행 중인 PowerShell 버전을 확인할 수 있는 방법은 다음과 같습니다:

  1. (Get-Host).Version 속성
  2. $host.Version 속성
  3. 레지스트리 (Windows PowerShell 전용)
  4. $PSVersionTable.PSVersion 속성

가장 추천되는 방법부터 가장 비추천되는 방법까지 PowerShell 버전을 찾는 모든 방법을 자세히 살펴보겠습니다.

Get-Host

PowerShell에는 호스트라는 개념이 있습니다. 호스트는 PowerShell 엔진을 호스팅하는 프로그램입니다. PowerShell 콘솔이나 통합 터미널이 있는 코드 편집기는 PowerShell 호스트입니다.

A host can have a version that is completely independent of PowerShell itself. This can be deceiving to many newcomers. Let me show you why.

만약 (Get-Host).Version를 실행하면 PowerShell 엔진 버전처럼 보이는 버전 번호가 반환됩니다. 겉모습은 속이기 쉽습니다.

아래에서는 Windows PowerShell 5.1에서 Get-Host를 실행한 결과를 보여드리겠습니다. 5.1.17134.858이 반환되었습니다. 이는 유효한 버전으로 보입니다.

PS51> (Get-Host).Version
Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      17134  858

그러나 때로는 통합 터미널에서 Get-Host를 실행할 때 버전이 동일하지 않을 수 있습니다. 보통 호스트는 엔진의 동일한 버전을 나타내지만, 항상 그렇지는 않습니다.

원격 컴퓨터에서 Get-Host를 통해 Powershell 버전 확인하기

Get-Host를 로컬 컴퓨터에서 실행할 때 동일한 버전이 반환되는 것으로 보이지만, 원격 컴퓨터에서는 절대 그렇지 않습니다.

예를 들어, 원격 Windows Server 2016 서버에서 Invoke-Command를 통해 Get-Host를 실행하고 결과를 확인해 보겠습니다.

PS51> Invoke-Command -ComputerName 10.0.0.5 -ScriptBlock {Get-Host} -Credential $cred

Major  Minor  Build  Revision PSComputerName
-----  -----  -----  -------- --------------
1      0      0      0        10.0.0.5

마지막으로 확인한 것으로는 Windows Server 2016에서 PowerShell v1을 실행할 수 없습니다.

Get-Host에 의존하는 것은 전반적으로 좋은 생각이 아닙니다.

Powershell 버전 확인 $host.Version 명령어

$host.Version을 참조하는 것은 Powershell 버전을 확인하는 또 다른 방법입니다. $host 변수는 Get-Host와 동일한 출력을 반환하는 자동 변수입니다.

Referencing $host.Version

이 방법에는 특별한 것이 없습니다. 그냥 Get-Host를 실행하는 것과 같습니다. 원격 컴퓨터에서 $host.Version를 실행합니다.

PowerShell Remoting으로 $host.Version을 실행하는 것과 동일한 동작을 볼 수 있습니다. PowerShell Remoting을 사용할 때 Get-Host를 실행하는 것과 동일합니다.

PS51> Invoke-Command -ComputerName 10.0.0.5 -ScriptBlock {$host.Version} -Credential $cred

Major  Minor  Build  Revision PSComputerName
-----  -----  -----  -------- --------------
1      0      0      0        10.0.0.5

위험, 윌 로빈슨!

PowerShell 자체를 열고 싶지 않다면 레지스트리를 확인할 수도 있습니다. PowerShell의 버전은 레지스트리 키 경로 HKLM:\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine의 값 아래에 숨겨져 있습니다. 이 레지스트리 키에는 PowerShellVersion이라는 값이 있으며 이를 Get-ItemProperty를 사용하여 참조할 수 있습니다.

PS51> (Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine -Name 'PowerShellVersion').PowerShellVersion
5.1.17134.1

이 버전은 다른 옵션과 유사하지만 리비전을 포함하지 않습니다.

PS51> [version](Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine -Name 'PowerShellVersion').PowerShellVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      17134  1

다른 도구 사용하기

레지스트리를 사용하면 PowerShell을 사용하지 않고도 버전을 찾을 수 있습니다. 레지스트리를 읽을 수 있는 명령 프롬프트 또는 다른 도구에서 명령을 실행할 수 있습니다.

CMD> reg query HKLM\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine /v PowerShellVersion

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine
    PowerShellVersion    REG_SZ    5.1.17134.1

원격 컴퓨터의 레지스트리

레지스트리는 정적이며 값이 로컬 또는 원격으로 변경되지 않습니다. 로컬에서 본 것이 원격에서도 동일하게 나타날 것임을 확신할 수 있습니다.

PS51> $scriptBlock = {
    [version](Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine -Name 'PowerShellVersion').PowerShellVersion
}
PS51> Invoke-Command -ComputerName 10.0.0.5 -ScriptBlock $scriptBlock -Credential $cred

Major  Minor  Build  Revision PSComputerName
-----  -----  -----  -------- --------------
5      1      17763  1        10.0.0.5

로컬 및 원격에서 동일한 버전을 표시하는 것이 좋습니다. 그러나 $PSVersionTable 자동 변수를 사용하여 더 나은 방법을 보여 드릴 수 있습니다.

$PSVersionTable.PSVersion 명령을 사용하여 PowerShell 버전을 확인하세요.

마지막이자 최종 방법은 $PSVersionTable 자동 변수의 PSVersion 속성을 참조하는 것입니다. 이 방법은 항상 PowerShell 엔진을 나타냅니다.

PS51> $PSVersionTable.PSVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      17134  858

$PSVersionTable 자동 변수는 PowerShell 엔진 버전에 관한 정보를 구체적으로 반환하는 읽기 전용 해시 테이블입니다. 이 자동 변수는 버전 뿐만 아니라 PSEdition도 반환합니다. 이 속성은 실행 중인 PowerShell 버전에 대한 더 많은 정보를 제공하기 위해 Core 또는 Desktop일 수 있습니다.

$PSVersionTable output

원격 컴퓨터의 $PSVersionTable

$PSVersionTable 자동 변수를 사용하면 로컬로 정확하게 작동하는 대로 원격으로도 정확합니다. 아래에서 볼 수 있듯이 스크립트 블록으로 $PSVersionTable.PSVersion을 래핑하고 해당 코드를 원격 컴퓨터에서 실행하면 동일한 버전을 반환합니다.

PS> Invoke-Command -ComputerName 10.0.0.5 -ScriptBlock {$PSVersionTable.PSVersion} -Credential $cred

Major  Minor  Build  Revision PSComputerName
-----  -----  -----  -------- --------------
5      1      17763  592      10.0.0.5

요약

이 블로그 게시물에서는 로컬 및 원격으로 PowerShell 버전을 확인하는 모든 방법을 배웠습니다. 처음 몇 가지 방법이 버전을 확인하는 데 어떤 방법을 사용하지 않아야할지에 대한 아이디어를 얻었으면 좋겠습니다!

I recommend always using $PSVersionTable.PSVersion. All of the other methods may appear similar to the PowerShell engine version but may not always reflect the engine version.

빠뜨린 방법이 있다면 댓글에서 알려주세요. 게시물을 업데이트하고 크레딧을 드릴 것입니다.

Source:
https://adamtheautomator.com/powershell-version/