SHIMSOFT-Fundamentals.psm1

function Get-PropertyNames {
    <#
    .SYNOPSIS
    オブジェクト配列からプロパティ名を取得します。
 
    .DESCRIPTION
    オブジェクト配列からプロパティ名を取得します。
    構成要素の異なるオブジェクトの配列から、すべてのプロパティ名を取得します。
     
 
    .EXAMPLE
    Get-PropertyName -Array $Array
     
 
    .EXAMPLE
    Get-PropertyName -Array $Array
     
 
    .EXAMPLE
    $Array | Get-PropertyName
 
    .EXAMPLE
    $Array | ft -Property (Get-PropertyName -Array $Array)
     
     
    .PARAMETER Array
    オブジェクト配列を指定してください。
     
     
    .LINK
 
    .NOTES
 
    .INPUTS
    パイプラインからの入力可能です。
 
    .OUTPUTS
    文字列
 
    #>

    [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseSingularNouns", "", Justification="Always multiple results.")]


    param(
        [Parameter(Mandatory=$false,Position=1,ValueFromPipeLine=$True)]
        [Array]$Array
    )
    
    $PropertyNames = @()

    foreach ($A in $Array) {
        $PropertyNames += ($A | Get-Member -MemberType Properties).Name
    }
    
    ($PropertyNames | Sort-Object -Unique)
    
}

function Get-MSProductLifeCycle {
    <#
    .SYNOPSIS
    マイクロソフト社製品の製品名からライフサイクル情報を確認します。
     
    .DESCRIPTION
    マイクロソフト社製品の製品名からライフサイクル情報を確認します。
    https://support.microsoft.com/api/lifecycle
    インターネットに接続できない環境の場合は利用できません。
     
 
    .EXAMPLE
    Get-MSProductLifeCycle -Product "Exchange Server 2010"
 
    .PARAMETER Product
    マイクロソフト製品名を指定します。半角スペースを含む場合は "Windows Server" のように指定します。
     
    .LINK
 
    .NOTES
    https://support.microsoft.com/api/lifecycle の Web サイト利用は無許可利用です。
 
    .INPUTS
    なし。パイプラインからの入力は受け付けません。
 
    .OUTPUTS
    ダウンロードした CSV データから生成されたオブジェクトです。
     
    #>

    Param(
    [Parameter(Mandatory=$true,Position=1)]
    [String]$Product
    )


    if ($Product -eq "") { $Product = "Windows Server" }

    

    $wc = New-Object System.Net.WebClient
    $url = 'https://support.microsoft.com/api/lifecycle/GetProductsLifecycle?query={"names":["' + $Product + '"],"years":"0","gdsId":0,"export":true}'

    $st = $wc.OpenRead($url)
    $enc = [System.Text.Encoding]::GetEncoding("UTF-8")
    $sr = New-Object System.IO.StreamReader($st, $enc)
    $html = $sr.ReadToEnd()
    $sr.Close()

    $htmlLine = $html.Split("`n")
    
    $htmlLine[0] = '"発売製品","ライフサイクル開始日","メインストリームサポート終了日","延長サポート終了日","サービスパックサポート終了日","備考"'
    ConvertFrom-Csv -InputObject $htmlLine
    Return
}

function ConvertTo-Narrow {
    <#
    .SYNOPSIS
    全角文字列を半角文字列に変換します。
     
     
    .DESCRIPTION
    全角文字列を半角文字列に変換します。
    すべての全角文字が半角に出来るわけではありません。
    平仮名、片仮名、数字、アルファベットが変換できます。
    全角平仮名は半角片仮名になります。
 
    .EXAMPLE
    ConvertTo-Narrow -String "あいうえお"
 
    .EXAMPLE
    ConvertTo-Narrow -String "12345"
 
    .PARAMETER String
    全角文字列を指定します。
     
    .LINK
 
    .NOTES
     
     
    .INPUTS
    なし。パイプラインからの入力は受け付けません。
 
    .OUTPUTS
    半角に変換した文字列を返します。
     
    #>

    Param(
    [Parameter(Mandatory=$true,Position=1)]
    [String]$String
    )
    
    $a = "あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをんぁぃぅぇぉゃゅょっ0123456789"
    $a += "アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァィゥェォャュョッ"
    $a += "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
    $a += "!#$%&()=~|-ー¥@{}「」[]【】〔〕`”`’`‘/*-+、,。.<>゛ ゜"

    $b = "アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァィゥェォャュョッ0123456789"
    $b += "アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァィゥェォャュョッ"
    $b += "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
    $b += "!#`$%&()=~|-ー\@`{}[][][][]`"`'``/*-+,,..<>゙ ゚"

    $c = "ヴがぎぐげござじずぜぞだぢづでどばびぶべぼぱぴぷぺぽ"
    $c += "ヴガギグゲゴザジズゼゾダヂヅデドバビブベボパピプペポ"
    
    $d = "ヴガギグゲゴザジズゼゾダヂヅデドバビブベボパピプペポ"
    $d += "ヴガギグゲゴザジズゼゾダヂヅデドバビブベボパピプペポ"
    
    
    $Work = $String -Split ""
    $Work = $Work[1..($Work.Count-2)]
    
    $Result = ""
    
    foreach ($s in $Work) {
        if ($a.IndexOf($s) -ne -1) {
            # 普通の文字
            $Result += $b[($a.IndexOf($s))]
        } else {
            if ($c.IndexOf($s) -ne -1) {
                # 濁音・半濁音
                $Result += $d.Substring(($c.IndexOf($s)*2),2)
            } else {
                # 変換できない
                $Result += $s
            }
        }
    }

    $Result.Replace(" "," ")
}


function ConvertTo-Wide {
    <#
    .SYNOPSIS
    半角文字列を全角文字列に変換します。
     
     
    .DESCRIPTION
    半角文字列を全角文字列に変換します。
    すべての半角文字が全角に出来るわけではありません。
    片仮名、数字、アルファベットが変換できます。
    半角片仮名は全角片仮名になります。
     
 
    .EXAMPLE
    ConverTo-Wide -String "アイウエオ"
 
    .EXAMPLE
    ConvertTo-Wide -String "12345"
 
    .PARAMETER String
    全角文字列を指定します。
     
    .LINK
 
    .NOTES
     
     
    .INPUTS
    なし。パイプラインからの入力は受け付けません。
 
    .OUTPUTS
    半角に変換した文字列を返します。
     
    #>

    Param(
    [Parameter(Mandatory=$true,Position=1)]
    [String]$String
    )
    

    $a = "アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァィゥェォャュョッ0123456789"
    $a += "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
    $a += "!#$%&()=~|-ー¥@{}「」[]【】〔〕`”`’`‘/*-+、,。.<>゛ ゜"


    $b = "アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァィゥェォャュョッ0123456789"
    $b += "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
    $b += "!#`$%&()=~|-ー\@`{}[][][][]`"`'``/*-+,,..<>゙ ゚"


    $c = "ヴガギグゲゴザジズゼゾダヂヅデドバビブベボパピプペポ"
    
    $d = "ヴガギグゲゴザジズゼゾダヂヅデドバビブベボパピプペポ"
    
    
    $Work = $String -Split ""
    $Work = $Work[1..($Work.Count-2)]
    
    $Result = ""
    $PreFetch = " "
    
    foreach ($s in $Work) {
        if ("゙ ゚".IndexOf($s) -ne -1 -and $d.IndexOf($PreFetch+$s) -ne -1) {
            $s = $PreFetch + $s
            $Result = $Result.Substring(0,$Result.Length-1)
        }
        
        if ($b.IndexOf($s) -ne -1) {
            # 普通の文字
            $Result += $a[($b.IndexOf($s))]
        } else {
            if ($d.IndexOf($s) -ne -1) {
                # 濁音・半濁音
                $Result += $c.Substring(($d.IndexOf($s)/2),1)
            } else {
                # 変換できない
                $Result += $s
            }
        }
        
        $PreFetch = $s
    }

    $Result.Replace(" "," ")
}

function Test-IsNumeric {
    <#
    .SYNOPSIS
    指定した文字列が数値文字列か検証します。
    数値文字列なら $True を、そうでないなら $False を返します。
    数値文字列とは [int] などにキャスト変換できる文字列を指します。
     
     
    .DESCRIPTION
    指定した文字列が数値文字列か検証します。
    数値文字列なら $True を、そうでないなら $False を返します。
     
 
    .EXAMPLE
    Test-IsNumeric -String "100"
    結果は $True
 
    .EXAMPLE
    Test-IsNumeric -String "123.4"
    結果は $True
 
    .EXAMPLE
    Test-IsNumeric -String "1,234"
    結果は $True
 
    .EXAMPLE
    Test-IsNumeric -String "123"
    結果は $False
    全角文字列は数値文字列とはみなされません。
     
    .EXAMPLE
    Test-IsNumeric -String "123abc"
    結果は $False
 
    .EXAMPLE
    Test-IsNumeric -String "百十五"
    結果は $False
 
    .PARAMETER String
    文字列を指定します。
     
    .LINK
 
    .NOTES
    s
     
    .INPUTS
    なし。パイプラインからの入力は受け付けません。
 
    .OUTPUTS
    半角に変換した文字列を返します。
     
    #>

    [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseDeclaredVarsMoreThanAssignments", "", Justification="The variable Work is suprress output int value.")]
    Param(
    [Parameter(Mandatory=$true,Position=1)]
    [String]$String
    )
    
    Try { $Work = [int]$String; $True } catch { $False }

}


Export-ModuleMember -Function Get-PropertyNames, Get-MSProductLifeCycle, ConvertTo-Narrow, ConvertTo-Wide, Test-IsNumeric