PowerShellの変数のスコープを確認する

#目的
PowerShellの変数がどのスコープで定義されているかを確認します。

#使用方法
ドットソースでList-Variables関数を実行します。
（関数の前にピリオド（.）と空白を置く）

```powershell:
. List-Variables
```

#出力例
- local, script, globalの各スコープとスコープ番号の対応を表示します。
- 定義済みの変数の一覧を表示し（~~AllScopeの属性を持つものは除外~~）、
変数が定義されているスコープ番号に"S"（privateスコープの場合は"P"）を表示します。また、local, script, globalの各スコープでの値（文字型に変換）を表示します。
- ウィンドウ幅のバッファサイズを170文字に設定します。

![ScreenShot-20180512230830.png](https://qiita-image-store.s3.amazonaws.com/0/189363/a5e6cb7a-8f44-04bd-d715-e2863c4eee86.png)

#ソース

```powershell:
Function global:List-Variables () {
    $orgErrorActionPreference = $ErrorActionPreference
    $ErrorActionPreference = "Stop"
    $global:FooBarBaz = 1
    $foo_g = -1
    $foo_j = 0
    do {
        try {
            if ((Get-Variable FooBarBaz -Scope $foo_j)) { $foo_g = $foo_j }
        } catch {}
        $foo_j++
    } while ($foo_g -lt 0)
    $foo_c = Get-PSCallStack
    $foo_s = $foo_g
    $foo_j = 0
    for ($foo_i = 1; $foo_i -lt $foo_c.Length; $foo_i++) {
        if ($foo_c[$foo_i].GetScriptLocation() -NotMatch "\.ps1")       { continue }
        if ($foo_c[$foo_i].InvocationInfo.MyCommand.CommandType -eq "") { continue }
        if ($foo_c[$foo_i].InvocationInfo.MyCommand.CommandType -eq "ExternalScript") { $foo_s = $foo_j; break }
        $foo_j++
    }
    Write-Output "Local: 0, Script: $foo_s, Global: $foo_g"
    Remove-Variable foo_* -Exclude foo_g -Scope local
    Remove-Variable FooBarBaz -Scope global


    $host.UI.RawUI.BufferSize = New-Object System.Management.Automation.Host.Size(170, $host.UI.RawUI.BufferSize.Height)

    Get-Variable -Exclude foo_g,orgErrorActionPreference | % {
#       if ($_.Options -Match "AllScope") { return }
        $foo_o =[PSCustomObject]@{ Name = $_.Name }
        try {
            $foo_t = (Get-Variable $_.Name -Scope local -ValueOnly).ToString() -Replace "(?s)^(.{37}).{4,}",'$1...'
        } catch {
            $foo_t = ""
        }
        $foo_o | Add-Member lo $foo_t
        try {
            $foo_t = (Get-Variable $_.Name -Scope script -ValueOnly).ToString() -Replace "(?s)^(.{37}).{4,}",'$1...'
        } catch {
            $foo_t = ""
        }
        $foo_o | Add-Member sc $foo_t
        try {
            $foo_t = (Get-Variable $_.Name -Scope global -ValueOnly).ToString() -Replace "(?s)^(.{37}).{4,}",'$1...'
        } catch {
            $foo_t = ""
        }
        $foo_o | Add-Member gl $foo_t
        for ($foo_i=0; $foo_i -le $foo_g; $foo_i++) {
            $foo_s = "s" + $foo_i.ToString()
            try {
                if ((Get-Variable $_.Name -Scope $foo_i).Options -NotMatch "Private") {
                    $foo_o | Add-Member $foo_s "S"
                } else {
                    $foo_o | Add-Member $foo_s "P"
                }
            } catch {
                $foo_o | Add-Member $foo_s "-"
            }
        }
        $foo_o
    } | format-table @{Expression={$_.Name};Label="Name"},`
                     @{Expression={$_.s0};Label="0"},`
                     @{Expression={$_.s1};Label="1"},`
                     @{Expression={$_.s2};Label="2"},`
                     @{Expression={$_.s3};Label="3"},`
                     @{Expression={$_.s4};Label="4"},`
                     @{Expression={$_.s5};Label="5"},`
                     @{Expression={$_.s6};Label="6"},`
                     @{Expression={$_.s7};Label="7"},`
                     @{Expression={$_.s8};Label="8"},`
                     @{Expression={$_.s9};Label="9"},`
                     @{Expression={$_.lo};Label=" local";Width=40},`
                     @{Expression={$_.sc};Label="script";Width=40},`
                     @{Expression={$_.gl};Label="global";Width=40}
    $ErrorActionPreference = $orgErrorActionPreference
    Remove-Variable foo_*                    -Scope local
    Remove-Variable orgErrorActionPreference -Scope local
}
```


クリエイティブ・コモンズ 表示 - 継承 4.0 国際