programing

Powershell에서 OS 버전, Linux 및 Windows 확인

goodsources 2023. 8. 4. 23:01
반응형

Powershell에서 OS 버전, Linux 및 Windows 확인

스크립트 내에서 Powershell을 사용하여 OS 유형(Linux, Windows)을 확인하려면 어떻게 해야 합니까?

스크립트의 이 부분이 Linux 호스트에서 실행될 때 ResponseUri가 인식되지 않습니다.

$UrlAuthority = $Request.BaseResponse | Select-Object -ExpandProperty ResponseUri | Select-Object -ExpandProperty Authority

그래서 저는.If다음과 유사한 OS 유형을 결정하는 문장:

If ($OsType -eq "Linux")
{
     $UrlAuthority = ($Request.BaseResponse).RequestMessage | Select-Object -ExpandProperty RequestUri | Select-Object -ExpandProperty host
}
Else
     $UrlAuthority = $Request.BaseResponse | Select-Object -ExpandProperty ResponseUri | Select-Object -ExpandProperty Authority

나는 사용할 수 있습니다.Get-CimInstance Win32_OperatingSystem리눅스에서는 인식되지 않기 때문에 실패할 수 있습니다.

다른 OS 플랫폼에서 볼 수 있는 환경 변수는 없습니까?

Get-ChildItem -Path Env:

특히, 적어도 Windows에서는 OS 환경 변수가 있으므로 다음을 사용하여 이를 수행할 수 있어야 합니다.$Env:OS.


시간이 어느 정도 흘렀고 PowerShell Core(v6) 제품이 GA 상태이기 때문에(Core 브랜딩이 v7에서 삭제됨) 다음과 같은 자동 부울 변수를 기반으로 플랫폼을 보다 정확하게 결정할 수 있습니다.

$IsMacOS
$IsLinux
$IsWindows

PowerShell Core(PowerShell 버전 6.0+)의 경우 자동 변수를 사용할 수 있습니다.$IsLinux,$IsMacOS그리고.$IsWindows.

예를들면,

if ($IsLinux) {
    Write-Host "Linux"
}
elseif ($IsMacOS) {
    Write-Host "macOS"
}
elseif ($IsWindows) {
    Write-Host "Windows"
}

윈도우즈/리눅스/OSX의 PowerShell 버전 6.1이 GA로 전환되었기 때문에 다음과 같은 새로운 속성을 사용할 수 있습니다.$PSVersionTable,OS,Platform그리고.GitCommitId

v6.0.0-beta.3 업데이트에는 몇 가지가 있습니다.breaking changes:

  • powershell.exe에 대한 위치 매개 변수를 -Command에서 -File로 변경합니다.

$PSVersionTable다음 날짜에

플랫폼Win32NTOSMicrosoft Windows 10.0.15063

PS C:\Users\LotPings> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      6.1.0
PSEdition                      Core
GitCommitId                    6.1.0
OS                             Microsoft Windows 10.0.17134
Platform                       Win32NT
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0

플랫폼UnixOSLinux (ubuntu)

PS /home/LotPings> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      6.1.0
PSEdition                      Core
GitCommitId                    6.1.0
OS                             Linux 4.15.0-34-generic #37-Ubuntu SMP Mon Aug 27 15:21:48 UTC 2018
Platform                       Unix
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0

플랫폼UnixOSDarwin

PS /Users/LotPings> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      6.1.0
PSEdition                      Core
GitCommitId                    6.1.0
OS                             Darwin 17.7.0 Darwin Kernel Version 17.7.0: Thu Jun 21 22:53:14 PDT 2018; root:xnu-4570.71.2~1/RE...
Platform                       Unix
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0

PowerShell [Core] 버전 6 이전에는 질문을 통해서만 이 기능이 가능했습니다.직접 NET.이 작업은 한 줄로 수행할 수 있습니다.

[System.Environment]::OSVersion.Platform

다음 중 하나가 반환됩니다.Win32NTWindows NT(모든 최신 버전의 Windows) 또는Unix모든 *nix(Mac, 리눅스 및 c. 포함)에 사용할 수 있습니다.만약 그것이 다시 돌아온다면,Unix그러면 분명히 v6+를 실행하고 있으므로 자세한 정보를 얻을 수 있습니다.$PSVersionTable.PSEdition,$PSVersionTable.Platform,그리고.$PSVersionTable.OS자동 변수도 사용할 수 있습니다.$IsLinux,$IsMacOs,그리고.$IsWindows.

제가 가지고 있는 것은 이것입니다.profile.ps1설정을 통해 이 작업을 쉽게 수행할 수 있습니다.$IsWindows:

function Get-PSPlatform
{
    return [System.Environment]::OSVersion.Platform
}
switch (Get-PSPlatform)
{
    'Win32NT' { 
        New-Variable -Option Constant -Name IsWindows -Value $True -ErrorAction SilentlyContinue
        New-Variable -Option Constant -Name IsLinux  -Value $false -ErrorAction SilentlyContinue
        New-Variable -Option Constant -Name IsMacOs  -Value $false -ErrorAction SilentlyContinue
     }
}

이 기능은 에서 제공된 대로 모든 버전의 PowerShell에서 작동합니다.버전 1.x 이후의 NET 플랫폼 참조자세한 내용은 ID 설명서를 참조하십시오.

Dave F의 코멘트를 보세요; 저는 SO가 코멘트에서 답변을 홍보하기 위해 작동하는 것처럼 보이기 때문에 이 답변을 작성했습니다.

사실 PowerShell 콘솔 자체에 의해 추가된 글로벌 변수가 있어야 합니다. 하지만 환경 변수로 간주되지 않기 때문에 사용 시 표시되지 않습니다.dir env:목록을 얻기 위해. 있는 것은 제별보가는지 OS것은입니다.$IsLinux,IsMacOS그리고.$IsWindowsMac/Linux PowerShell 6.0.0-rc 파일입니다.

다음을 사용하여 사용 가능한 목록을 볼 수 있습니다.Get-Variable(프로파일을 로드하지 않고 새 세션에서 기본 제공되는 기능만 사용하려면).

위의 내용을 바탕으로 Windows에서 실행 중인지 여부만 감지하고 PowerShell 및 PowerShell Core에서 전후 호환되는 스크립트를 원할 경우 다음과 같은 이점이 있습니다.

if ($IsWindows -or $ENV:OS) {
    Write-Host "Windows"
} else {
    Write-Host "Not Windows"
}

Windows인지 Linux인지만 확인해야 하는 경우에는 다음과 같은 방법을 사용할 수 있습니다(빠르고 더러운 방법).

if ([System.Boolean](Get-CimInstance -ClassName Win32_OperatingSystem -ErrorAction SilentlyContinue))
{
    #windows
}
else
{
    #Not windows
}

Osx를 위한 몇 가지 다른 방법:

sw_vers -productVersion

10.12.6

또는 (바로 위에 "key - os_version"이 있는데 어떻게 관련되어 있는지 모르겠습니다):

[xml]$xml = system_profiler SPSoftwareDataType -xml   
$xml.plist.array.dict.array.dict.string -match 'macos'  

macOS 10.12.6 (16G1510)

이것은 다른 답변에 대한 설명에 설명된 문제에 대해 Powershell의 모든 버전에서 작동합니다.

$iswin = $PSVersionTable.Platform -match '^($|(Microsoft )?Win)'

와 함께$False9인치인

최신 PowerShell 코어가 설치되어 있지 않은 경우 다음과 같은 작은 스크립트 블록을 사용할 수 있습니다.

if ($PSVersionTable.PSVersion.Major -lt 6.0) {
    switch ($([System.Environment]::OSVersion.Platform)) {
        'Win32NT' { 
            New-Variable -Option Constant -Name IsWindows -Value $True -ErrorAction SilentlyContinue
            New-Variable -Option Constant -Name IsLinux -Value $false -ErrorAction SilentlyContinue
            New-Variable -Option Constant -Name IsMacOs -Value $false -ErrorAction SilentlyContinue
        }
    }
}
$script:IsLinuxEnv = (Get-Variable -Name "IsLinux" -ErrorAction Ignore) -and $IsLinux
$script:IsMacOSEnv = (Get-Variable -Name "IsMacOS" -ErrorAction Ignore) -and $IsMacOS
$script:IsWinEnv = !$IsLinuxEnv -and !$IsMacOSEnv

언급URL : https://stackoverflow.com/questions/44703646/determine-the-os-version-linux-and-windows-from-powershell

반응형