tech.guitarrapc.cóm

Technical updates

PowerShell 2.0のBuild-In Variableを取得する

以前、PowerShell3.0のユーザー変数のみを取得する記事を書きました。
PowerShell 3.0のBuild-In Variableを取得する
が、PowerShell 2.0では、そもそもこの部分が動かせないので使えません。
$builtinVariable = [psobject].Assembly.GetType('System.Management.Automation.SpecialVariables').GetFields('NonPublic,Static') `
        | Where-Object FieldType -eq ([string]) `
        | ForEach-Object GetValue $null
そこで今回は、PowerShell 2.0で取得する方法です。

変数の取得

簡単です。新規Runspaceを作ってしまうのです。 新規Runspace = ユーザー変数の入る余地はありませんね! よって、PowerShell 3.0でしか動かなかった部分をいかに差し替えます。
[powershell]::create().addcommand('Get-Variable').invoke() | Select-Object -ExpandProperty Name
残りは同じ要領でできちゃいます。

ユーザー定義変数取得Function

はい簡単。 3.0からの変更点1. 追加するハードコード部分が増えています。 3.0からの変更点2. -notinが使えないので、-notcontainsに変更しています。
function Get-UserVariables{

    param(
    )

    $builtinVariable = [powershell]::create().addcommand('Get-Variable').invoke() | Select-Object -ExpandProperty Name


    $other = , @(
		"FormatEnumerationLimit",
		"MaximumAliasCount",
		"MaximumDriveCount",
		"MaximumErrorCount",
		"MaximumFunctionCount",
		"MaximumVariableCount",
		"PGHome",
		"PGSE",
		"PGUICulture",
		"PGVersionTable",
		"PROFILE",
		"PSSessionOption",
		"MyInvocation",
		"other",
		"PSBoundParameters",
		"this",
		"_",
		"args",
		"input"
		)

    $other `
        | ForEach-Object {$builtinVariable += $_}

    Get-Variable `
        | Where {$builtinVariable -notcontains $_.Name} `
        | select Name, Value, Description

}
実行は、一文だけです。
Get-UserVariables | Format-List
Functionで利用した変数だけですね!
Name        : builtinVariable
Value       : {$, ?, ^, ConfirmPreference...}
Description :

まとめ

PowerShell3.0を使いつつー、PowerGUI使いましょう。