给定一个命令,是哪个PowerShell版本引入的?

3
我在我的脚本顶部放置了#Requires -Version,但需要确定我需要哪个版本。我希望查询每个调用的 cmdlet 是由哪个版本的 PowerShell 引入的。但我在 Get-Help -verbose 命令的输出中没有看到这个信息。我没有找到一个官方的网页来列出这个信息。
有人知道是否有一种标准的方法来查找哪个版本的 PowerShell 引入了特定的 cmdlet 吗?或者,我是否有更好的方法来实现我想做的事情?

1
我通常会查看给定 cmdlet 的 msdn 文档(带有参数和类型的文档,而不是无用的“使用 foo 命令”页面),并检查版本下拉菜单以查看其起始位置。 - Eris
1个回答

8
据我所知,查找此信息的“标准”方法是阅读MSDN。 :-) 您可以使用Get-Help-Online开关轻松访问相关页面,例如:
Get-Help -Name "Get-DscConfiguration" -Online

另一种方法可能是使用-Version开关启动powershell.exe,设置特定版本,例如powershell.exe -Version 2,然后使用Get-Command cmdlet查看您的cmdlet是否已列出。

我很喜欢这个!下面是一些代码,它似乎可以正常解析脚本,并确定命令是否是不同 PS 版本中有效的 cmdlets。 目前看来,-PSVersion 开关在 Start-Job 上似乎并不支持 "1.0" 或 "5.0"。

param(
  $file = 'C:\scripts\PowerShell\Toolkit\Get-PSVersionCompatibility.ps1'
)

New-Variable tokens
New-Variable parseerrors
$p = [System.Management.Automation.Language.Parser]::ParseFile($file,[ref]$tokens,[ref]$parseerrors)
$Commands = $tokens | ?{$_.TokenFlags -contains "CommandName"} | Sort -Unique | Select Value

$ScriptBlock = {
  param($PSVersion,$Commands)

  $Output = New-Object -TypeName PSObject -Property @{PSVersion = $PSVersion}


  foreach($Command in $Commands) {
    if([String]::IsNullOrEmpty($Command.Value)){continue}

    if(Get-Command | ?{$_.Name -eq $Command.Value}) {
      $Available = $true
    } else {
      $Available = $false
    }

    $Output | Add-Member -MemberType NoteProperty -Name $($Command.Value) -Value $Available
  }

  return $Output
}

$Results = @()

foreach($PSVersion in 2..4) {
  $job = Start-Job -PSVersion "$PSVersion.0" -ScriptBlock $ScriptBlock -ArgumentList $PSVersion,$Commands

  Wait-Job $job | Out-Null
  $Results += (Receive-Job $job | Select PSVersion,*-*)
  Remove-Job $job
}

$Results | FT -AutoSize

Remove-Variable tokens
Remove-Variable parseerrors


很不幸,自从新的“docs.micrsosoft..”发布以来,我再也找不到“引入版本”了... 不管怎样,你的解决方案真的很强大。谢谢!我已经将其添加并扩展到开源库中,如果有问题请告诉我:https://github.com/AstralisSomnium/PowerShell-No-Library-Just-Functions - Patrick
去吧,没问题。 - Charlie Joynt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接