Answers:
使用$PSVersionTable.PSVersion
以确定发动机的版本。如果变量不存在,则可以安全地假定引擎为version 1.0
。
请注意,$Host.Version
并且(Get-Host).Version
也不可靠-它们仅反映主机的版本,而不反映引擎的版本。PowerGUI,PowerShellPLUS等都是托管应用程序,它们将设置主机的版本以反映其产品版本-完全正确,但不是您想要的。
PS C:\> $PSVersionTable.PSVersion
Major Minor Build Revision
----- ----- ----- --------
4 0 -1 -1
$PSVersionTable
更可靠,并返回$ PSVersion。您也可以使用$PSVersionTable.PSVersion
。即使您远程连接到运行不同版本(invoke-command -computername myRemotePC -Credential foo {$host}
)的计算机,它看起来$host
也只会显示他们同意进行序列化的最低版本。虽然$PSVersionTable
会显示真实版本。希望它能对某人有所帮助..
notepad $profile
烦恼function psver { $PSVersionTable; $PSVersionTable.PSVersion }
,以至于我只好跑去扔了。重新加载后. $profile
,我可以随时输入psver
以获取详细的版本信息和其他详细信息。
我将使用Get-Host或$ PSVersionTable。正如Andy Schneider指出的那样,$PSVersionTable
它在版本1中无效;它是在版本2中引入的。
get-host
Name : ConsoleHost
Version : 2.0
InstanceId : d730016e-2875-4b57-9cd6-d32c8b71e18a
UI : System.Management.Automation.Internal.Host.InternalHostUserInterface
CurrentCulture : en-GB
CurrentUICulture : en-US
PrivateData : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy
IsRunspacePushed : False
Runspace : System.Management.Automation.Runspaces.LocalRunspace
$PSVersionTable
Name Value
---- -----
CLRVersion 2.0.50727.4200
BuildVersion 6.0.6002.18111
PSVersion 2.0
WSManStackVersion 2.0
PSCompatibleVersions {1.0, 2.0}
SerializationVersion 1.1.0.1
PSRemotingProtocolVersion 2.1
$host.version
是不可靠的-例如在PowerGUI的,则返回的PowerGUI主机版本,这是不一样的的powershell引擎版本(这是什么是需要的。)
您可以查看内置变量$psversiontable
。如果不存在,则您具有V1。如果确实存在,它将为您提供所需的所有信息。
1 > $psversiontable
Name Value
---- -----
CLRVersion 2.0.50727.4927
BuildVersion 6.1.7600.16385
PSVersion 2.0
WSManStackVersion 2.0
PSCompatibleVersions {1.0, 2.0}
SerializationVersion 1.1.0.1
PSRemotingProtocolVersion 2.1
要确定是否已安装PowerShell,可以检查注册表是否存在
HKEY_LOCAL_MACHINE\Software\Microsoft\PowerShell\1\Install
和
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\3
,如果存在,则该值是否为1(对于已安装),如博客文章中所述。检查PowerShell是否已安装和版本。
要确定已安装的PowerShell的版本,可以检查注册表项
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine\PowerShellVersion
和
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\3\PowerShellEngine\PowerShellVersion
要确定从.ps1脚本安装的PowerShell的版本,可以使用以下单行代码,如我正在运行PowerShell版本的PowerShell.com上所述。
$isV2 = test-path variable:\psversiontable
同一站点还提供了返回版本的功能:
function Get-PSVersion {
if (test-path variable:psversiontable) {$psversiontable.psversion} else {[version]"1.0.0.0"}
}
您只能通过从外部调用PowerShell (例如从命令提示符)直接用一行来检查版本。
powershell -Command "$PSVersionTable.PSVersion"
根据@psaul的说法,实际上您可以使用一个与它的来源无关的命令(CMD,PowerShell或Pwsh)。谢谢你
powershell -command "(Get-Variable PSVersionTable -ValueOnly).PSVersion"
我已经测试过,它在CMD和PowerShell上都可以正常工作。
cmd
,并powershell
无济于事。我也会期望同样的行为。:)
pwsh -Command "(Get-Variable PSVersionTable -ValueOnly).PSVersion"
效果很好。
您可以通过完成以下检查来验证是否安装了Windows PowerShell版本:
在Windows PowerShell控制台中,在命令提示符处键入以下命令,然后按Enter:
Get-Host | Select-Object Version
您将看到如下所示的输出:
Version
-------
3.0
http://www.myerrorsandmysolutions.com/how-to-verify-the-windows-powershell-version-installed/
Microsoft建议使用向前兼容的方法来检查是否已安装PowerShell并确定已安装的版本是查看两个特定的注册表项。如果链接断开,我将在此复制详细信息。
根据链接的页面:
取决于任何其他注册表项,PowerShell.exe的版本或PowerShell.exe的位置,不能保证长期运行。
要检查是否安装了任何版本的PowerShell,请在注册表中检查以下值:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1
要检查是否已安装PowerShell的1.0版或2.0版,请在注册表中检查以下值:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine
我发现检查安装是否最简单的方法是:
cmd
“然后确定”)powershell
然后按回车键。然后,您应该得到PowerShell PS
提示:C:\Users\MyUser>powershell
Windows PowerShell
Copyright (C) 2009 Microsoft Corporation. All rights reserved.
PS C:\Users\MyUser>
然后,您可以在PowerShell提示符下输入$PSVersionTable.PSVersion
以下命令检查版本:
PS C:\Users\MyUser> $PSVersionTable.PSVersion
Major Minor Build Revision
----- ----- ----- --------
2 0 -1 -1
PS C:\Users\MyUser>
键入exit
是否要返回到命令提示符(exit
如果还要关闭命令提示符,请再次输入)。
要运行脚本,请参阅http://ss64.com/ps/syntax-run.html。
采用:
$psVersion = $PSVersionTable.PSVersion
If ($psVersion)
{
#PowerShell Version Mapping
$psVersionMappings = @()
$psVersionMappings += New-Object PSObject -Property @{Name='5.1.14393.0';FriendlyName='Windows PowerShell 5.1 Preview';ApplicableOS='Windows 10 Anniversary Update'}
$psVersionMappings += New-Object PSObject -Property @{Name='5.1.14300.1000';FriendlyName='Windows PowerShell 5.1 Preview';ApplicableOS='Windows Server 2016 Technical Preview 5'}
$psVersionMappings += New-Object PSObject -Property @{Name='5.0.10586.494';FriendlyName='Windows PowerShell 5 RTM';ApplicableOS='Windows 10 1511 + KB3172985 1607'}
$psVersionMappings += New-Object PSObject -Property @{Name='5.0.10586.122';FriendlyName='Windows PowerShell 5 RTM';ApplicableOS='Windows 10 1511 + KB3140743 1603'}
$psVersionMappings += New-Object PSObject -Property @{Name='5.0.10586.117';FriendlyName='Windows PowerShell 5 RTM 1602';ApplicableOS='Windows Server 2012 R2, Windows Server 2012, Windows Server 2008 R2 SP1, Windows 8.1, and Windows 7 SP1'}
$psVersionMappings += New-Object PSObject -Property @{Name='5.0.10586.63';FriendlyName='Windows PowerShell 5 RTM';ApplicableOS='Windows 10 1511 + KB3135173 1602'}
$psVersionMappings += New-Object PSObject -Property @{Name='5.0.10586.51';FriendlyName='Windows PowerShell 5 RTM 1512';ApplicableOS='Windows Server 2012 R2, Windows Server 2012, Windows Server 2008 R2 SP1, Windows 8.1, and Windows 7 SP1'}
$psVersionMappings += New-Object PSObject -Property @{Name='5.0.10514.6';FriendlyName='Windows PowerShell 5 Production Preview 1508';ApplicableOS='Windows Server 2012 R2'}
$psVersionMappings += New-Object PSObject -Property @{Name='5.0.10018.0';FriendlyName='Windows PowerShell 5 Preview 1502';ApplicableOS='Windows Server 2012 R2'}
$psVersionMappings += New-Object PSObject -Property @{Name='5.0.9883.0';FriendlyName='Windows PowerShell 5 Preview November 2014';ApplicableOS='Windows Server 2012 R2, Windows Server 2012, Windows 8.1'}
$psVersionMappings += New-Object PSObject -Property @{Name='4.0';FriendlyName='Windows PowerShell 4 RTM';ApplicableOS='Windows Server 2012 R2, Windows Server 2012, Windows Server 2008 R2 SP1, Windows 8.1, and Windows 7 SP1'}
$psVersionMappings += New-Object PSObject -Property @{Name='3.0';FriendlyName='Windows PowerShell 3 RTM';ApplicableOS='Windows Server 2012, Windows Server 2008 R2 SP1, Windows 8, and Windows 7 SP1'}
$psVersionMappings += New-Object PSObject -Property @{Name='2.0';FriendlyName='Windows PowerShell 2 RTM';ApplicableOS='Windows Server 2008 R2 SP1 and Windows 7'}
foreach ($psVersionMapping in $psVersionMappings)
{
If ($psVersion -ge $psVersionMapping.Name) {
@{CurrentVersion=$psVersion;FriendlyName=$psVersionMapping.FriendlyName;ApplicableOS=$psVersionMapping.ApplicableOS}
Break
}
}
}
Else{
@{CurrentVersion='1.0';FriendlyName='Windows PowerShell 1 RTM';ApplicableOS='Windows Server 2008, Windows Server 2003, Windows Vista, Windows XP'}
}
您可以从“ 如何确定已安装的PowerShell版本”中下载详细脚本。
忘记此页面而永不返回的最简单方法是学习Get-Variable
:
Get-Variable | where {$_.Name -Like '*version*'} | %{$_[0].Value}
无需记住每个变量。只要Get-Variable
足够(和“应该有一些关于版本”)。
$PSVersionTable
要检查是否已安装PowerShell,请使用:
HKLM\Software\Microsoft\PowerShell\1 Install ( = 1 )
要检查是否已安装RC2或RTM,请使用:
HKLM\Software\Microsoft\PowerShell\1 PID (=89393-100-0001260-00301) -- For RC2
HKLM\Software\Microsoft\PowerShell\1 PID (=89393-100-0001260-04309) -- For RTM
资料来源:本网站。
由于最有帮助的答案没有解决if是否存在的问题,我想我会通过一种快速而又肮脏的解决方案来解决这个问题。它取决于PowerShell是否位于您可能想要的路径环境变量中。(因为我不知道,所以提示了最佳答案的提示。)将其粘贴到文本文件中并命名
测试Powershell Version.cmd
或类似。
@echo off
echo Checking powershell version...
del "%temp%\PSVers.txt" 2>nul
powershell -command "[string]$PSVersionTable.PSVersion.Major +'.'+ [string]$PSVersionTable.PSVersion.Minor | Out-File ([string](cat env:\temp) + '\PSVers.txt')" 2>nul
if errorlevel 1 (
echo Powershell is not installed. Please install it from download.Microsoft.com; thanks.
) else (
echo You have installed Powershell version:
type "%temp%\PSVers.txt"
del "%temp%\PSVers.txt" 2>nul
)
timeout 15
我需要检查PowerShell的版本,然后运行适当的代码。我们的某些服务器运行v5,而其他服务器运行v4。这意味着某些功能(例如compress)可能会或可能不会可用。
这是我的解决方案:
if ($PSVersionTable.PSVersion.Major -eq 5) {
#Execute code available in PowerShell 5, like Compress
Write-Host "You are running PowerShell version 5"
}
else {
#Use a different process
Write-Host "This is version $PSVersionTable.PSVersion.Major"
}
下面的cmdlet将返回PowerShell版本。
$PSVersionTable.PSVersion.Major
$PSVersionTable
是一个自动变量;一个东西。它不是cmdlet。
这是“批处理文件获取Powershell版本”的顶部搜索结果,因此,我想提供一个基本示例,说明如何根据Powershell版本在批处理文件中进行条件流
通用示例
powershell "exit $PSVersionTable.PSVersion.Major"
if %errorlevel% GEQ 5 (
echo Do some fancy stuff that only powershell v5 or higher supports
) else (
echo Functionality not support by current powershell version.
)
现实世界的例子
powershell "exit $PSVersionTable.PSVersion.Major"
if %errorlevel% GEQ 5 (
rem Unzip archive automatically
powershell Expand-Archive Compressed.zip
) else (
rem Make the user unzip, because lazy
echo Please unzip Compressed.zip prior to continuing...
pause
)
用选择运算符扩展答案:
Get-Host | select {$_.Version}
Get-Host
)。