スクリプト内から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では認識されないため失敗します。
OSの他のプラットフォームで表示できる環境変数はありませんか?
Get-ChildItem -Path Env:
特に、少なくともWindowsにはOS環境変数があるため、shouldを使用してこれを実現できます$Env:OS
しばらく経ち、PowerShell Core製品はGA now(6.0.*
)、次の自動ブール変数に基づいてプラットフォームをより正確に決定できます。
$IsMacOS
$IsLinux
$IsWindows
Windows/Linux/OSX のPowerShellバージョン6.1はGAに移動したため、$PSVersionTable
、OS
、Platform
の新しいプロパティを使用できますおよびGitCommitId
更新v6.0.0-beta.3にはいくつかのbreaking changes
があります:
$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
実際には、PowerShellコンソール自体によってグローバル変数が追加される必要があります。ただし、これらは環境変数とは見なされません。そのため、dir env:
を使用してリストを取得するときに表示されません。現時点では、$IsLinux
、IsMacOS
、および$IsWindows
です。これは、Mac/Linux用の少なくともPowerShellバージョン6.0.0-rc以上です。
Get-Variable
を使用するだけで、利用可能なもののリストを見ることができます(デフォルトで組み込みのものが必要な場合は、プロファイルをロードせずに新しいセッションで)。
WindowsかLinuxかを確認するだけでよい場合は、これを使用できます(高速でダーティ)。
if ([System.Boolean](Get-CimInstance -ClassName Win32_OperatingSystem -ErrorAction SilentlyContinue))
{
#windows
}
else
{
#Not windows
}
PowerShell Core (Powershell Version 6.0+)の場合、 自動変数 :$IsLinux
、$IsMacOS
および$IsWindows
。
例えば、
if ($IsLinux) {
Write-Host "Linux"
}
elseif ($IsMacOS) {
Write-Host "macOS"
}
elseif ($IsWindows) {
Write-Host "Windows"
}
上記に基づいて、Windowsで実行しているかどうかを検出するだけで、PowerShellとPowerShell Coreで前方互換性と後方互換性のあるスクリプトが必要な場合は、次のようになります。
if ($IsWindows -or $ENV:OS) {
Write-Host "Windows"
} else {
Write-Host "Not Windows"
}