web-dev-qa-db-ja.com

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を使用できますが、Linuxでは認識されないため失敗します。

15
boomcubist

OSの他のプラットフォームで表示できる環境変数はありませんか?

Get-ChildItem -Path Env:

特に、少なくともWindowsにはOS環境変数があるため、shouldを使用してこれを実現できます$Env:OS


しばらく経ち、PowerShell Core製品はGA now(6.0.*)、次の自動ブール変数に基づいてプラットフォームをより正確に決定できます。

$IsMacOS
$IsLinux
$IsWindows
24

Windows/Linux/OSX のPowerShellバージョン6.1はGAに移動したため、$PSVersionTableOSPlatformの新しいプロパティを使用できますおよびGitCommitId

更新v6.0.0-beta.3にはいくつかのbreaking changesがあります:

  • Powershell.exeの位置パラメーターを-Commandから-Fileに変更します

$PSVersionTable on:

プラットフォームWin32NT OS Microsoft 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

プラットフォームUnix OS Linux (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

プラットフォームUnix OS Darwin

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
8
LotPings

実際には、PowerShellコンソール自体によってグローバル変数が追加される必要があります。ただし、これらは環境変数とは見なされません。そのため、dir env:を使用してリストを取得するときに表示されません。現時点では、$IsLinuxIsMacOS、および$IsWindowsです。これは、Mac/Linux用の少なくともPowerShellバージョン6.0.0-rc以上です。

Get-Variableを使用するだけで、利用可能なもののリストを見ることができます(デフォルトで組み込みのものが必要な場合は、プロファイルをロードせずに新しいセッションで)。

5
areyling

WindowsかLinuxかを確認するだけでよい場合は、これを使用できます(高速でダーティ)。

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

PowerShell Core (Powershell Version 6.0+)の場合、 自動変数$IsLinux$IsMacOSおよび$IsWindows

例えば、

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

上記に基づいて、Windowsで実行しているかどうかを検出するだけで、PowerShellとPowerShell Coreで前方互換性と後方互換性のあるスクリプトが必要な場合は、次のようになります。

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