Câu hỏi Xác định phiên bản PowerShell đã cài đặt


Làm thế nào tôi có thể xác định phiên bản PowerShell nào được cài đặt trên máy tính và thực sự nếu nó được cài đặt?


2085
2017-12-01 11:30


gốc


Hình sự mà người ta cần phải đặt câu hỏi này. Microsoft nên cung cấp một cách nhất quán để tìm phiên bản mới nhất cho tất cả các phần mềm được cài đặt. - user1040323
Cách nhất quán đó sẽ là một trình quản lý gói, thứ mà tôi thích mỗi khi tôi sử dụng Linux. - aaaaaa


Các câu trả lời:


Sử dụng $PSVersionTable.PSVersion để xác định phiên bản động cơ. Nếu biến không tồn tại, nó là an toàn để giả sử động cơ là phiên bản 1.0.

Lưu ý rằng $Host.Version và (Get-Host).Version không đáng tin cậy - chúng phản ánh phiên bản của máy chủ, chứ không phải động cơ. PowerGUI, PowerShellPLUS, v.v. là tất cả các ứng dụng lưu trữ và họ sẽ thiết lập phiên bản của máy chủ để phản ánh sản phẩm của họ phiên bản - đó là hoàn toàn chính xác, nhưng không phải là những gì bạn đang tìm kiếm.

PS C:\> $PSVersionTable.PSVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
4      0      -1     -1

2802
2018-01-19 11:06



Hmm ... cào nhận xét cuối cùng. Có vẻ như PS2 đã được cài đặt, nhưng một số tính năng không khả dụng, và vì lý do nào đó, thư mục cài đặt có tên '1.0'. Cảm ơn Microsoft. - Daniel Cassidy
$PSVersionTable đáng tin cậy hơn và trả về $ PSVersion. Bạn cũng có thể dùng $PSVersionTable.PSVersion. Ngay cả khi bạn được kết nối từ xa với máy chạy phiên bản khác (invoke-command -computername myRemotePC -Credential foo {$host}), nó có vẻ như $host sẽ chỉ hiển thị phiên bản thấp nhất mà họ đã đồng ý để tuần tự hóa. Trong khi $PSVersionTable sẽ hiển thị phiên bản thực. Hy vọng nó sẽ giúp ai đó .. - vulcan raven
Có vẻ $ host.Version không phải là một lựa chọn tốt ... Nếu bạn từ xa đến một máy chạy PowerShell 3, bạn sẽ quay lại 1.0, vì RemotingHost có vẻ là v1. Sử dụng $ PSVersionTable trả về đúng 3. - Danny Tuppeny
-1 vì điều này không trả lời cách xác định xem PowerShell có được cài đặt ở tất cả như được hỏi trong câu hỏi gốc hay không. Microsoft khuyên bạn nên kiểm tra sổ kiểm nhập để xem phiên bản nào, nếu có, được cài đặt. Như đã nêu trên trang được liên kết, phương pháp này là phương thức duy nhất được đảm bảo để hoạt động lâu dài. - Starfish
@Starfish Lệnh được hiển thị khởi chạy Powershell bằng Command Prompt. Không phải lệnh chỉ lỗi với "powershell not found" nếu nó chưa được cài đặt? - jpmc26


Tôi sẽ sử dụng Get-Host hoặc là $ PSVersionTable. Như Andy Schneider chỉ ra, $PSVersionTable không hoạt động trong phiên bản 1; nó đã được giới thiệu trong phiên bản 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

371
2017-12-01 11:34



cảm ơn bạn! NB: Trên XP của tôi, nơi tôi tự nâng cấp từ v1 Powershell, thư mục thực tế và đường dẫn đăng ký (misleadingly ?!) tham khảo v1 NOT v2. Điều này cũng giống như những người khác ở đây, nhưng đó là lý do tại sao tôi đã rất lo lắng cho dù tôi đã cài đặt nó. Con đường của tôi là; C: \ WINDOWS \ system32 \ windowspowershell \ v1.0 - AnneTheAgile
Nếu $ psversiontable không tồn tại, nó hoàn toàn an toàn để giả sử bạn đang ở v1.0 - và hey mau, cũng trả lời câu hỏi của bạn. $host.versionkhông đáng tin cậy - ví dụ như trong powergui, nó trả về phiên bản máy chủ powergui không giống phiên bản động cơ powerhell (đó là điều mong muốn). - x0n
Tốt đẹp. Ngay cả khi nhận được phiên bản chính là quá đủ phần lớn thời gian thông qua cmdlet get-host. - RBT
Trạng thái câu trả lời được chấp nhận "... $ Host.Version và (Get-Host) .Phiên bản không đáng tin cậy - chúng chỉ phản ánh phiên bản của máy chủ chứ không chỉ là công cụ". - Peter Mortensen


Để xác định xem PowerShell đã được cài đặt chưa, bạn có thể kiểm tra sổ đăng ký để biết sự tồn tại của

HKEY_LOCAL_MACHINE\Software\Microsoft\PowerShell\1\Install

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\3

và, nếu nó tồn tại, cho dù giá trị là 1 (để cài đặt), như chi tiết trong bài đăng trên blog Kiểm tra xem PowerShell đã được cài đặt và phiên bản chưa.

Để xác định phiên bản PowerShell đã được cài đặt, bạn có thể kiểm tra các khóa registry

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine\PowerShellVersion

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

Để xác định phiên bản PowerShell được cài đặt từ tập lệnh .ps1, bạn có thể sử dụng một lớp lót sau, như được mô tả chi tiết trên PowerShell.com trong Phiên bản PowerShell nào tôi đang chạy.

$isV2 = test-path variable:\psversiontable

Cùng một trang cũng cung cấp một hàm để trả về phiên bản:

function Get-PSVersion {
    if (test-path variable:psversiontable) {$psversiontable.psversion} else {[version]"1.0.0.0"}
}

87
2017-12-01 14:37



Hữu ích bởi vì trên một máy chủ Windows 2003 tôi không thể tìm thấy mục trình đơn bắt đầu cho PowerShell (nó đã có nhưng không rõ ràng), nhưng khóa registry trả lời câu hỏi của tôi. - Holistic Developer
+1. Đây cũng là phương pháp mà Microsoft khuyến nghị để phát hiện. - Starfish
Đối với PowerScript 3.0, dường như có một mục mới, HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 3 (ngoài HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 1). Địa điểm thích hợp trong trường hợp này để nhận được phiên bản dường như là HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 3 \ PowerShellEngine \ PowerShellVersion (giá trị mẫu là "3.0"). - Peter Mortensen


Bạn có thể xem biến được tạo sẵn, $psversiontable. Nếu nó không tồn tại, bạn có V1. Nếu nó tồn tại, nó sẽ cung cấp cho bạn tất cả thông tin bạn cần.

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    

77
2018-04-25 13:47





Chỉ muốn thêm 2 xu của tôi ở đây.

Bạn có thể trực tiếp kiểm tra phiên bản bằng một dòng duy nhất bằng cách gọi powerhell bên ngoài, chẳng hạn như từ Command Prompt

powershell -Command "$PSVersionTable.PSVersion"

CHỈNH SỬA:

Theo @psaul bạn có thể thực sự có một lệnh mà là bất khả tri từ nơi nó đến (CMD, Powershell hoặc Pwsh), cảm ơn bạn vì điều đó.

powershell -command "(Get-Variable PSVersionTable -ValueOnly).PSVersion" 

Tôi đã thử nghiệm và nó hoạt động hoàn hảo trên cả CMD và Powershell

image


23
2018-03-10 11:32



Tôi nhận được lỗi khủng khiếp này với thử: "System.Collections.Hashtable.PSVersion: Thuật ngữ 'System.Collections.Hashtable.PSVersion' không được công nhận là tên của lệnh ghép ngắn, hàm, tệp kịch bản hoặc chương trình có thể hoạt động. đánh vần tên hoặc nếu đường dẫn được bao gồm, hãy xác minh rằng đường dẫn là chính xác và thử lại. ". Vì vậy, không phải lúc nào cũng hoạt động - Gonmator
Tôi rất vui vì bạn đã chỉ ra rằng vì nó rất tốt để biết các trường hợp góc, nhưng tôi đoán nó vẫn hoạt động cho đa số mọi người. - Patrick Bard
@tresf cho phép tôi sử dụng các từ của bạn trong phản hồi của tôi để ngăn chặn sự hiểu lầm thêm. - Patrick Bard
@ PatrickBard, làm ơn. - tresf
@tresf (và @Gonmator) bạn CÓ THỂ chạy điều này một cách agnostically từ CMD, PowerShell, hoặc thậm chí Pwsh (PS 6.0) nhưng bạn cần sử dụng biểu mẫu này: powershell -command "(Get-Variable PSVersionTable -ValueOnly) .PSVersion" (sẽ làm việc trong mọi trường hợp) - PSaul


Bạn có thể xác minh phiên bản Windows PowerShell đã cài đặt bằng cách hoàn tất kiểm tra sau:

  1. Bấm Bắt đầu, bấm Tất cả Chương trình, bấm Phụ kiện, bấm Windows PowerShell, rồi bấm Windows PowerShell.
  2. Trong giao diện điều khiển Windows PowerShell, gõ lệnh sau tại dấu nhắc lệnh và sau đó nhấn ENTER:

    Get-Host | Phiên bản chọn đối tượng

Bạn sẽ thấy đầu ra trông như thế này:

Version
-------
3.0

http://www.myerrorsandmysolutions.com/how-to-verify-the-windows-powershell-version-installed/


19
2018-06-17 07:59



Bạn cho rằng PowerShell đã được cài đặt với các tùy chọn mặc định và các phím tắt không bị xóa khỏi Start Menu. Tốt hơn để sử dụng kiểm tra đăng ký. - Xalorous
Tôi nghĩ rằng nếu bạn cần sử dụng PowerShell trước, bạn cố gắng chạy nó như là tiêu chuẩn cần cài đặt, sau đó nếu bạn không tìm thấy biểu tượng của bạn, hãy thử chạy nó từ Command Prompt. Tôi không nghĩ rằng bạn bắt đầu từ sổ đăng ký. - Eclipses
Trạng thái câu trả lời được chấp nhận "... $ Host.Version và (Get-Host) .Phiên bản không đáng tin cậy - chúng chỉ phản ánh phiên bản của máy chủ chứ không chỉ là công cụ". - Peter Mortensen


Phương pháp tương thích được đề xuất của Microsoft để kiểm tra xem PowerShell có được cài đặt hay không và xác định phiên bản đã cài đặt là xem xét hai khóa đăng ký cụ thể. Tôi đã sao chép các chi tiết ở đây trong trường hợp ngắt liên kết.

Theo trang được liên kết:

Tùy thuộc vào bất kỳ khoá đăng ký nào khác hoặc phiên bản PowerShell.exe hoặc vị trí của PowerShell.exe không được đảm bảo hoạt động trong thời gian dài.

Để kiểm tra xem mọi phiên bản của PowerShell được cài đặt, hãy kiểm tra giá trị sau trong sổ đăng ký:

  • Vị trí chính: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1
  • Tên giá trị: Cài đặt
  • Loại giá trị: REG_DWORD
  • Dữ liệu giá trị: 0x00000001 (1

Để kiểm tra cho dù phiên bản 1.0 hoặc 2.0 của PowerShell được cài đặt, hãy kiểm tra giá trị sau trong sổ đăng ký:

  • Vị trí chính: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine
  • Tên giá trị: PowerShellVersion
  • Loại giá trị: REG_SZ
  • Dữ liệu giá trị: <1.0 | 2.0>

18
2017-11-04 10:24



Đối với PowerShell 3.0, có vẻ như mới, HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 3. - Peter Mortensen
Điều này không hoạt động trên win7. Tôi tin rằng các khóa registry Powershell sẽ bị xóa ngay bây giờ. - N-ate


Tôi tìm thấy cách dễ nhất để kiểm tra xem có được cài đặt hay không:

  • chạy một dấu nhắc lệnh (Bắt đầu, Chạy, cmd, sau đó OK)
  • kiểu powershell sau đó nhấn trở lại. Sau đó, bạn sẽ nhận được PowerShell PS lời nhắc:

C:\Users\MyUser>powershell

Windows PowerShell
Copyright (C) 2009 Microsoft Corporation. All rights reserved.

PS C:\Users\MyUser>

Sau đó, bạn có thể kiểm tra phiên bản từ lời nhắc PowerShell bằng cách nhập $PSVersionTable.PSVersion:

PS C:\Users\MyUser> $PSVersionTable.PSVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
2      0      -1     -1

PS C:\Users\MyUser>

Kiểu exit nếu bạn muốn quay lại dấu nhắc lệnh (exit một lần nữa nếu bạn muốn đóng dấu nhắc lệnh).

Để chạy tập lệnh, hãy xem http://ss64.com/ps/syntax-run.html.


11
2017-11-01 01:41



Thích câu trả lời được chấp nhận  điều này không trả lại bất cứ điều gì cho PowerShell 1.0. Phương thức đăng ký rõ ràng hơn. - Peter Mortensen
Nếu powershell không có trong đường dẫn, phiên bản này sẽ cung cấp cho một ấn tượng sai lầm rằng nó không được cài đặt. Phương thức Registry cung cấp đầy đủ thông tin. Hiện diện và phiên bản. - Xalorous


Sử dụng:

$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'}
}

Bạn có thể tải xuống tập lệnh chi tiết từ Cách xác định phiên bản PowerShell đã cài đặt.


9
2017-12-01 11:35





Để kiểm tra xem PowerShell có được cài đặt hay không:

HKLM\Software\Microsoft\PowerShell\1 Install ( = 1 )

Để kiểm tra xem RC2 hoặc RTM có được cài đặt hay không:

HKLM\Software\Microsoft\PowerShell\1 PID (=89393-100-0001260-00301) -- For RC2
HKLM\Software\Microsoft\PowerShell\1 PID (=89393-100-0001260-04309) -- For RTM

Nguồn: Trang web này.


8
2018-04-17 20:46



Cách tốt nhất để kiểm tra xem PowerShell có được cài đặt không sử dụng tập lệnh ps1 không? Có thể sử dụng mã C #, nó sẽ là mẫu mã nguồn đầy đủ hữu ích. - Kiquenet