Powershell 将值转换为相应的文本

Powershell 将值转换为相应的文本,powershell,powershell-remoting,Powershell,Powershell Remoting,我正在尝试完成脚本以检查远程机器上的powershell版本,现在我只剩下最后一部分,我正在从powershell获取文件的版本号,但我正在寻找将6.2.1200.XXX转换为版本3的方法,到目前为止,我的脚本是 Foreach ($Computer in $Computers) { Try { Write-Host "Checking Computer $Computer" $path = "\\$Computer\C$\windows\Syst

我正在尝试完成脚本以检查远程机器上的powershell版本,现在我只剩下最后一部分,我正在从powershell获取文件的版本号,但我正在寻找将6.2.1200.XXX转换为版本3的方法,到目前为止,我的脚本是

Foreach ($Computer in $Computers)
{
    Try
    {
        Write-Host "Checking Computer $Computer"
        $path = "\\$Computer\C$\windows\System32\WindowsPowerShell\v1.0\powershell.exe"
        if (test-path $path)
        {
            Write-host "Powershell is installed::"
            [bool](ls $path).VersionInfo
            Write-host " "
            Write-host "Powershell Remoting Enabled::"
            [bool](Test-WSMan -ComputerName $Computer -ErrorAction SilentlyContinue)
        }
        else
        {
            Write-Host "Powershell isn't installed" -ForegroundColor 'Red'
        }
        Write-Host "Finished Checking Computer $Computer"
    }

包含修订的文件版本可能会随着更新的安装而更改,但前3个数字应该很有用。您可以强制转换为
[version]
,也可以使用简单的拆分或替换来摆脱构建

然后可以创建一个哈希表,其中版本号作为键,PS版本作为值

$fileVer=[version](获取项$path)。VersionInfo
$myVer=“{0}.{1}.{2}”-f$fileVer.Major、$fileVer.Minor、$fileVer.Build
$verTable=@{
'6.3.1200' = 3
'6.3.9600' = 4
}
$psVer=$verTable[$myVer]
否则,如果您确定PowerShell远程处理实际上已启用,则另一种方法是询问:

$prEnabled=[bool](测试WSMan-ComputerName$Computer-ErrorAction SilentlyContinue)
如果($prEnabled){
$psVer=Invoke命令-ComputerName$computer-ScriptBlock{$PSVersionTable.PSVersion.Major}
}
设置
$myVer
的备选方案: 字符串替换:

$fileVer=[version](获取项$path)。VersionInfo
$myVer=“$($fileVer.Major)。$($fileVer.Minor)。$($fileVer.Build)”
替换(正则表达式):

$fileVer=(获取项$path)。版本信息
$myVer=$fileVer-替换“\。\d+$”,“”
#将最后一个点和任何数字替换为零
按范围拆分:

$fileVer=(获取项$path)。版本信息
$myVer=($fileVer-split'\.)[0..2]
#在文字点上拆分,然后使用范围获取数组的前3个元素
使用开关-通配符(归功于Ansgar Wiechers):

$fileVer=(获取项$path)。VersionInfo.ProductVersion
$myVer=开关-通配符($fileVer){
'6.3.1200.*' { 3 }
'6.3.9600.*' { 4 }
}

我用的代码是

[CmdletBinding()]
Param (
    [Parameter(Mandatory = $true)]
    $ComputerName
)
if (Test-Path $ComputerName)
{
    $Computers = Get-Content $ComputerName
}
Else
{
    $Computers = $ComputerName
}

Foreach ($Computer in $Computers)
{
    Try
    {
        Write-Host "Checking Computer $Computer"
        $path = "\\$Computer\C$\windows\System32\WindowsPowerShell\v1.0\powershell.exe"
        $fileVer = (Get-Item $path).VersionInfo.ProductVersion
        $myVer = switch -Wildcard ($fileVer)
        {
            '6.0.6002.*' { 1 }
            '6.1.7600.*' { 2 }
            '6.2.9200.*' { 3 }
            '6.3.9600.*' { 4 }
        }

        if (test-path $path)
        {
            Write-host "Powershell is installed::"
            [bool](ls $path).VersionInfo
            Write-host " "
            Write-host "Powershell Version installed::"
            Write-host " $myVer "
            Write-host " "
            Write-host "Powershell Remoting Enabled::"
            [bool](Test-WSMan -ComputerName $Computer -ErrorAction SilentlyContinue)
        }
        else
        {
            Write-Host "Powershell isn't installed" -ForegroundColor 'Red'
        }
        Write-Host "Finished Checking Computer $Computer"
    }

    catch { }
}

另一种选择是在
.VersionInfo.ProductVersion
属性上使用
开关通配符
语句。@briantist我将其添加到哈希表中并进行了编码,但现在我的脚本在该点停止,不再继续。@AnsgarWiechers将其编辑到答案中。我总是忘记开关-通配符,谢谢@卢克,你是说它出错了?将新代码编辑到问题中,如果有错误,也显示错误。这是语句的
[version]
部分,是一个逻辑错误,但开关工作正常。
$myVer
变量包含该版本。如果要显示它,请使用类似于
Write Host$myVer
。请不要尝试基于Windows版本反向查找。这可能会以许多愚蠢的方式打破,例如用户在Win7上安装PS5,SP为旧操作系统带来新功能,或者只是一个新操作系统推出了一个你从未见过的数字方案。只需询问PowerShell正在运行的版本
Powershell.exe-C“$PSVersionTable.PSVersion”
@RyanBemrose如果我能将Powershell远程到每台我不能远程的机器上,那么你的方法就行了,它不会检查windows的版本,而是检查由供应商(Microsoft)设置的Powershell文件的版本