LoginSignup
0
2

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-05-12

目的

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

使用方法

ドットソースでList-Variables関数を実行します。
(関数の前にピリオド(.)と空白を置く)

. List-Variables

出力例

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

ScreenShot-20180512230830.png

ソース

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 国際

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2