НейроАгент

Как проверить версию PowerShell и статус установки

Узнайте несколько способов определения версии PowerShell и проверки статуса установки на системах Windows, macOS и Linux с подробными скриптами и советами по устранению неполадок.

Вопрос

Как определить, какая версия PowerShell установлена на компьютере, и как проверить, установлен ли PowerShell вообще?

НейроАгент

Вы можете определить, какая версия PowerShell установлена, с помощью команды $PSVersionTable в PowerShell, которая отображает подробную информацию о версии, или запустив $PSVersionTable.PSVersion для получения только номера версии. Чтобы проверить, установлен ли PowerShell вообще, можно проверить наличие исполняемого файла PowerShell с помощью команд, таких как powershell --version или найдя путь установки в системных каталогах.

Содержание


Базовое определение версии PowerShell

Самый простой способ проверить версию PowerShell — выполнить следующую команду в терминале PowerShell:

powershell
$PSVersionTable

Эта команда отображает comprehensive таблицу, содержащую подробную информацию о вашей установке PowerShell, включая номер версии, номер сборки и другие релевантные детали. Вывод обычно выглядит так:

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

Чтобы получить только номер версии, можно использовать:

powershell
$PSVersionTable.PSVersion

Для быстрого отображения версии:

powershell
$PSVersionTable.PSVersion.ToString()

Проверка статуса установки PowerShell

Метод 1: Использование команд PowerShell

Если вы подозреваете, что PowerShell может быть не установлен, можно попробовать запустить PowerShell и проверить наличие ошибок:

powershell
# Попытка доступа к переменным PowerShell
$PSVersionTable 2>$null
if ($?) {
    Write-Host "PowerShell установлен"
} else {
    Write-Host "PowerShell недоступен"
}

Метод 2: Проверка из командной строки

Из любого командного файла (cmd.exe) можно проверить установку PowerShell:

cmd
powershell --version

Если PowerShell установлен, это отобразит номер версии. Если нет, вы получите сообщение об ошибке.

Метод 3: Проверка каталога установки

Можно проверить установку PowerShell, проверив типичные пути установки:

powershell
# Проверка типичных путей установки
$paths = @(
    "$env:ProgramFiles\PowerShell\*\pwsh.exe",
    "$env:ProgramFiles\PowerShell\*\pwsh.dll",
    "$env:ProgramFiles(x86)\PowerShell\*\pwsh.exe",
    "$env:ProgramFiles(x86)\PowerShell\*\pwsh.dll"
)

foreach ($path in $paths) {
    Get-Item $path -ErrorAction SilentlyContinue | Select-Object -First 1
}

Методы определения для конкретных платформ

Системы Windows

В Windows могут быть установлены как Windows PowerShell (версии 5.1 и ниже), так и PowerShell Core (версии 6+). Вот как различать их:

Для Windows PowerShell:

powershell
# Проверка, запущен ли Windows PowerShell
if ($PSVersionTable.PSEdition -eq 'Desktop') {
    Write-Host "Запущен Windows PowerShell $($PSVersionTable.PSVersion)"
} else {
    Write-Host "Запущен PowerShell Core $($PSVersionTable.PSVersion)"
}

Обнаружение PowerShell 7+:

powershell
# Проверка, установлен ли PowerShell 7+
$pwshPath = "$env:ProgramFiles\PowerShell\*\pwsh.exe"
Get-Item $pwshPath -ErrorAction SilentlyContinue | Select-Object -First 1

Системы macOS и Linux

В macOS и Linux доступен только PowerShell Core:

bash
# Проверка версии PowerShell из bash
pwsh --version

# Или проверка, установлен ли PowerShell
which pwsh

В самом PowerShell на этих платформах:

powershell
# Информация, специфичная для платформы
$PSVersionTable.Platform
$PSVersionTable.OS

# Проверка, запущена ли система на macOS или Linux
if ($PSVersionTable.Platform -eq 'Unix') {
    $unixType = if ($PSVersionTable.OS -like '*Darwin*') { 'macOS' } else { 'Linux' }
    Write-Host "Запущена на $unixType"
}

Скрипт определения для кроссплатформенной работы

Вот комплексный скрипт, который работает на всех платформах:

powershell
function Get-PowerShellVersion {
    param(
        [switch]$Detailed
    )
    
    if ($PSVersionTable) {
        $version = $PSVersionTable.PSVersion
        $edition = $PSVersionTable.PSEdition
        $platform = $PSVersionTable.Platform
        
        if ($Detailed) {
            [PSCustomObject]@{
                Version = $version.ToString()
                Major = $version.Major
                Minor = $version.Minor
                Patch = $version.Patch
                Build = $version.Build
                Revision = $version.Revision
                Edition = $edition
                Platform = $platform
                GitCommitId = $PSVersionTable.GitCommitId
                OS = $PSVersionTable.OS
            }
        } else {
            "$edition $version"
        }
    } else {
        "PowerShell не обнаружен"
    }
}

# Использование
Get-PowerShellVersion
Get-PowerShellVersion -Detailed

Расширенная информация о версии

Полные свойства версии

Версии PowerShell содержат несколько свойств, предоставляющих подробную информацию:

powershell
$version = $PSVersionTable.PSVersion

Write-Host "Основная версия: $($version.Major)"
Write-Host "Второстепенная версия: $($version.Minor)"
Write-Host "Версия исправления: $($version.Patch)"
Write-Host "Номер сборки: $($version.Build)"
Write-Host "Ревизия: $($version.Revision)"
Write-Host "Полная строка версии: $($version.ToString())"

Сравнение версий PowerShell

Можно сравнивать версии PowerShell программно:

powershell
function Compare-PowerShellVersion {
    param(
        [Version]$TargetVersion,
        [switch]$OrHigher
    )
    
    $currentVersion = $PSVersionTable.PSVersion
    
    if ($OrHigher) {
        return $currentVersion -ge $TargetVersion
    } else {
        return $currentVersion -eq $TargetVersion
    }
}

# Примеры
Compare-PowerShellVersion -TargetVersion "7.0.0" -OrHigher
Compare-PowerShellVersion -TargetVersion "5.1" -OrHigher

Обнаружение конкретных функций PowerShell

Разные версии вводят разные функции. Вот как проверить возможности конкретных версий:

powershell
# Проверка функций PowerShell 7+
if ($PSVersionTable.PSVersion -ge "7.0.0") {
    Write-Host "Доступны функции PowerShell 7+"
    # Функции, такие как parallelForEach, тернарный оператор и т.д.
}

# Проверка функций, специфичных для Windows PowerShell
if ($PSVersionTable.PSEdition -eq 'Desktop') {
    Write-Host "Доступны функции настольного издания Windows"
    # Функции, такие как специфичные для Windows командлеты
}

# Проверка экспериментальных функций
if ($PSVersionTable.ContainsKey('PSVersion') -and 
    $PSVersionTable.PSVersion -ge "7.2.0") {
    Write-Host "Доступны экспериментальные функции"
}

Скрипты для автоматической проверки версии

Комплексный скрипт обнаружения

Вот полный скрипт, который проверяет установку PowerShell и предоставляет подробную информацию о версии:

powershell
<#
.SYNOPSIS
    Комплексный скрипт обнаружения версии PowerShell
.DESCRIPTION
    Обнаруживает установку PowerShell и предоставляет подробную информацию о версии
    на всех поддерживаемых платформах
#>

function Get-CompletePowerShellInfo {
    [CmdletBinding()]
    param(
        [switch]$IncludePaths,
        [switch]$IncludeAllDetails
    )
    
    $result = [ordered]@{
        PowerShellDetected = $false
        Version = $null
        Edition = $null
        Platform = $null
        OS = $null
        InstallationPaths = @()
        AdditionalInfo = @{}
    }
    
    # Проверка, запущен ли PowerShell
    if ($PSVersionTable) {
        $result.PowerShellDetected = $true
        $result.Version = $PSVersionTable.PSVersion.ToString()
        $result.Edition = $PSVersionTable.PSEdition
        $result.Platform = $PSVersionTable.Platform
        $result.OS = $PSVersionTable.OS
        
        # Получение путей установки
        if ($IncludePaths) {
            switch ($result.Platform) {
                'Win32NT' {
                    $paths = @(
                        "$env:ProgramFiles\PowerShell\*\pwsh.exe",
                        "$env:ProgramFiles(x86)\PowerShell\*\pwsh.exe",
                        "$env:SystemRoot\System32\WindowsPowerShell\v1.0\powershell.exe"
                    )
                }
                'Unix' {
                    $paths = @(
                        "/usr/local/bin/pwsh",
                        "/usr/bin/pwsh",
                        "/opt/microsoft/powershell/*/pwsh"
                    )
                }
            }
            
            foreach ($path in $paths) {
                $found = Get-Item $path -ErrorAction SilentlyContinue | 
                        Select-Object -First 1
                if ($found) {
                    $result.InstallationPaths += $found.FullName
                }
            }
        }
        
        # Дополнительная информация
        if ($IncludeAllDetails) {
            $result.AdditionalInfo = @{
                GitCommitId = $PSVersionTable.GitCommitId
                PSRemotingProtocolVersion = $PSVersionTable.PSRemotingProtocolVersion
                SerializationVersion = $PSVersionTable.SerializationVersion
                WSManStackVersion = $PSVersionTable.WSManStackVersion
                PSCompatibleVersions = $PSVersionTable.PSCompatibleVersions -join ', '
            }
        }
    }
    
    [PSCustomObject]$result
}

# Примеры использования
Get-CompletePowerShellInfo
Get-CompletePowerShellInfo -IncludePaths -IncludeAllDetails

Кроссплатформенный пакетный скрипт

Для сред, где нужно проверять PowerShell из cmd.exe или bash:

batch
@echo off
REM Обнаружение версии PowerShell для Windows cmd.exe

powershell -Command "if ($PSVersionTable) { $PSVersionTable.PSVersion } else { 'PowerShell не установлен' }" 2>nul
if %ERRORLEVEL% EQU 0 (
    echo PowerShell установлен
) else (
    echo PowerShell не установлен или отсутствует в PATH
)
bash
#!/bin/bash
# Обнаружение версии PowerShell для Linux/macOS bash

if command -v pwsh &> /dev/null; then
    echo "PowerShell установлен"
    pwsh --version
else
    echo "PowerShell не установлен"
    exit 1
fi

Устранение распространенных проблем

PowerShell не найден в PATH

Если команды PowerShell не распознаются, возможно, при установке PowerShell не был добавлен в системный PATH:

Windows:

powershell
# Проверка текущего PATH
$env:PATH -split ';'

# Добавление PowerShell в PATH (требует прав администратора)
$pwshPath = (Get-Command pwsh).Source
$env:PATH += ";$pwshPath"

Linux/macOS:

bash
# Добавление PowerShell в PATH
export PATH="$PATH:/usr/local/bin"
# Или для системной установки
sudo ln -s /opt/microsoft/powershell/*/pwsh /usr/local/bin/pwsh

Установлено несколько версий PowerShell

Когда установлено несколько версий PowerShell, может потребоваться указать, какую версию использовать:

powershell
# Список всех доступных версий PowerShell
Get-ChildItem "$env:ProgramFiles\PowerShell" | 
    Where-Object { $_.Name -match '^[0-9]' } | 
    Select-Object Name, FullName

# Запуск конкретной версии PowerShell
& "$env:ProgramFiles\PowerShell\7\pwsh.exe" -Command "Write-Host 'PowerShell 7'"

Проблемы с правами доступа

На некоторых системах могут возникать проблемы с правами доступа при попытке запустить PowerShell:

powershell
# Проверка политики выполнения
Get-ExecutionPolicy

# Установка политики выполнения (требует прав администратора)
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

# Запуск PowerShell с конкретной политикой
powershell -ExecutionPolicy Bypass -File script.ps1

Проблемы совместимости версий

При работе со скриптами для разных версий PowerShell:

powershell
# Проверка минимально требуемой версии
$minimumVersion = "5.1"
if ($PSVersionTable.PSVersion -lt $minimumVersion) {
    Write-Error "Версия PowerShell $($PSVersionTable.PSVersion) не поддерживается. Минимально требуемая: $minimumVersion"
    exit 1
}

# Использование команд, специфичных для версии
if ($PSVersionTable.PSVersion -ge "7.0.0") {
    # Код, специфичный для PowerShell 7+
    $result = 1..1000 | ForEach-Object -Parallel { $_ * 2 } -ThrottleLimit 10
} else {
    # Код для устаревшего PowerShell
    $result = 1..1000 | ForEach-Object { $_ * 2 }
}

Заключение

Определение версии PowerShell и статуса установки с помощью описанных выше методов является простым процессом. Для быстрой проверки используйте $PSVersionTable в PowerShell или powershell --version из командной строки. Ключевые выводы:

  1. Используйте $PSVersionTable для получения comprehensive информации о версии в PowerShell
  2. Проверяйте $PSVersionTable.PSEdition для различия между Windows PowerShell и PowerShell Core
  3. Используйте методы, специфичные для платформы, для систем macOS и Linux
  4. PowerShell 7+ предлагает кроссплатформенную совместимость при сохранении обратной совместимости
  5. Автоматизированные скрипты могут помочь в обнаружении версии на нескольких системах

Для системных администраторов и разработчиков понимание, какая версия PowerShell установлена, имеет решающее значение для совместимости скриптов и устранения неполадок. Предоставленные скрипты и методы работают на разных платформах и могут быть интегрированы в более крупные автоматизированные рабочие процессы.

Источники

  1. Документация Microsoft PowerShell - Об автоматических переменных
  2. Документация Microsoft PowerShell - Установка PowerShell
  3. Репозиторий Microsoft PowerShell GitHub - Информация о версии
  4. Блог команды PowerShell - История версий PowerShell
  5. Stack Overflow - Обнаружение версии PowerShell