PowerShell 2.0では標準コマンドレットの数が1.0の129個から236個へと、107個増えています。また、既存のコマンドレットの一部にパラメータが増えています。そこで、2.0で新しく加わったコマンドレットと、新しく追加されたパラメータを列挙するスクリプトを作ってみました。
まず、1.0がインストールされている環境で、コマンドレットのリストをXMLに書き出します。次のコマンドを実行してください。
get-command -type cmdlet|export-clixml cmdlets1.xml -depth 3
同様に、2.0の環境でも実行してください。
get-command -type cmdlet|export-clixml cmdlets2.xml -depth 3
出来上がった二つのxmlファイルをカレントディレクトリに置いて、次のスクリプトを実行すると、新しく追加されたコマンドレットとパラメータが列挙されます。(必要なら適宜リダイレクトするなどしてファイルに落とし込んでください)
function Get-CmdletHash
{
param([string]$path)
$cmdlets = Import-Clixml $path
$cmdletsHash = @{}
$cmdlets|
%{
$parameters = @()
$_.ParameterSets|
%{
$_.Parameters|
%{
$parameters += $_.Name
}
}
$parameters = $parameters|Sort-Object|Get-Unique|?{"WarningAction","WarningVariable" -notcontains $_}
$cmdletsHash.Add($_.Name,$parameters)
}
return $cmdletsHash
}
$ver1 = Get-CmdletHash cmdlets1.xml
$ver2 = Get-CmdletHash cmdlets2.xml
$ver2.Keys|
%{
if($ver1.ContainsKey($_))
{
$result = Compare-Object $ver1[$_] $ver2[$_]
if($result)
{
"[Update] $_"
$result | Format-Table
}
}
else
{
"[New] $_ `r`n"
}
}
出力結果を置いておきます。こちら。
このスクリプトではGet-CommandコマンドレットがSystem.Management.Automation.CmdletInfoというコマンドレットの情報を格納したオブジェクトを返すことを利用し、Export-Clixmlコマンドレットでシリアライズ化してXMLファイルに落とし込むことにより異なるバージョンのPowerShell同士を比較しています。ここで-depthパラメータを3にしているのは、パラメータ情報を格納するParametersプロパティがルートから3階層下にあるためです。(デフォルトは2階層下までを出力。PS2.0ではCmdletInfoにParametersプロパティというのがあって2階層でたどれるのですが1.0にこのプロパティはないのでParameterSetsプロパティからたどる必要があります)
また、WarningActionとWarningVariableという共通パラメータが増えているので、これらはすべてのコマンドレットに共通して追加されているパラメータなので除外しておきます。
あとはパラメータをコマンドレットごとに配列化して、Compare-Objectで比較しています。新しく追加されたコマンドレットは[New]のマークをつけ、既存のコマンドレットでパラメータに変化があるものは[Update]をつけて追加されたパラメータを列挙するようにしています。
かなりたくさんのコマンドレットでパラメータが増えたことが分かりますね。また、Get-CommandコマンドレットのPSSnapinパラメータが廃止され、Moduleパラメータに変更されたことなどが分かったりします。
1.0ユーザーだった方にお勧めのスクリプトです。