DBのテーブルを使っているか検索するスクリプト その2

処理が長くなってきたので、ここまでの一連の処理を関数化する。

気になるのが以前聞いていた、主処理より先に関数の宣言を行わなければならないという事。

#設定
#Applicationとしての名称(英字)
$app_name_en = "DbTableSearch"

#処理の実行
init_app_dir ("〇〇さんは宇宙一美しい")

#関数の定義
function init_app_dir ($app_name_en) {
    $app_name_en
}


#実行結果

PS C:\Users\y****\Documents\powershell> c:\Users\y****\Documents\powershell\dbtable_search.ps1

〇〇さんは宇宙一美しい

DbTableSearch

????普通に行けてる。
じゃあ、聞き違いかバージョンアップでできるようになったのか。

変数のスコープも関数内で完結するようで問題ない。書き直そう。

#アプリケーション保存先ディレクトリ用初期化処理
init_app_dir ($app_name_en, [ref]$path_my_app_data)





function init_app_dir ([string]$app_name, [ref]$app_folder) {
    #APPDATAの特殊ファイルを取得する
    $path_app_data = (get-ChildItem env: | Where-Object {$_.Name -eq "APPDATA"} | Select-Object Value).Value;

    #特殊フォルダのパスを確認
    if((Test-Path -Path $path_app_data -PathType Container) -eq $FALSE){
        # メッセージボックスの表示
        [System.Windows.Forms.MessageBox]::Show("特殊フォルダ" + $path_app_data + "が存在しないかアクセスできません", "致命的なエラー")
        exit 1
    }

    #データ保存先パス変数を生成
    $mypath = ($path_app_data + '\' + $app_name[0])
    $app_folder.Value = $mypath

    #このスクリプトのためのフォルダがあるかどうかを判断。
    #無ければ作る
    if((Test-Path -Path $mypath -PathType Container) -eq $FALSE)
    {
        #アプリケーションデータの保存先フォルダを作成する
        #処理的にはIOを伴うのでtry-catchを入れる
        try{
            #フォルダを作る処理
            New-Item -Path $mypath -ItemType Directory
        }catch [Exception] {
            #タイミング的に作られていたら気にせず進む。
            #無ければ何らかのエラーなので、エラーメッセージを表示して終了
            if((Test-Path -Path $app_folder.Value -PathType Container) -eq $FALSE){
                # メッセージボックスの表示
                [System.Windows.Forms.MessageBox]::Show(
                        "アプリケーションデータ保存用フォルダ:" + 
                        $app_folder.Value + 
                        "の作成に失敗しました(" + 
                        $error +
                        ")", 
                        "致命的なエラー"
                )
                exit 1          
            }
        }
    }

}

という事で作ってみたものの、引数が一つでも参照渡しになると、他の引数もオブジェクトに変わってしまい、引数へのアクセスが困難になってしまった。

これについては調査と理解には時間がかかりそうなので、後日にする。
取得したいアプリケーション用フォルダのパスの文字列は返り値で受けることにする。

#設定
#Applicationとしての名称(英字)
$app_name_en = "DbTableSearch"

# アセンブリの読み込み
Add-Type -Assembly System.Windows.Forms
#フォームなどがデフォルトがUS-ASCIIで化けるため、SJISに変更する
$OutputEncoding = [console]::OutputEncoding
#アプリケーションデータ保存フォルダ
$path_my_app_data = ""

#アプリケーション保存先ディレクトリ用初期化処理
$path_my_app_data = init_app_dir ($app_name_en)






#アプリケーションデータフォルダ初期化処理
function init_app_dir ($app_name) {
    #APPDATAの特殊ファイルを取得する
    $path_app_data = (get-ChildItem env: | Where-Object {$_.Name -eq "APPDATA"} | Select-Object Value).Value;

    #特殊フォルダのパスを確認
    if((Test-Path -Path $path_app_data -PathType Container) -eq $FALSE){
        # メッセージボックスの表示
        [System.Windows.Forms.MessageBox]::Show("特殊フォルダ" + $path_app_data + "が存在しないかアクセスできません", "致命的なエラー")
        exit 1
    }

    #データ保存先パス変数を生成
    $mypath = ($path_app_data + '\' + $app_name)

    #このスクリプトのためのフォルダがあるかどうかを判断。
    #無ければ作る
    if((Test-Path -Path $mypath -PathType Container) -eq $FALSE)
    {
        #アプリケーションデータの保存先フォルダを作成する
        #処理的にはIOを伴うのでtry-catchを入れる
        try{
            #フォルダを作る処理
            New-Item -Path $mypath -ItemType Directory
        }catch [Exception] {
            #タイミング的に作られていたら気にせず進む。
            #無ければ何らかのエラーなので、エラーメッセージを表示して終了
            if((Test-Path -Path $mypath -PathType Container) -eq $FALSE){
                # メッセージボックスの表示
                [System.Windows.Forms.MessageBox]::Show(
                        "アプリケーションデータ保存用フォルダ:" + 
                        $mypath + 
                        "の作成に失敗しました(" + 
                        $error +
                        ")", 
                        "致命的なエラー"
                )
                exit 1          
            }
        }
    }

    return $mypath
}

ひとまずこれで動作。
次はデータベースへの接続用ダイアログの作成に移る。

と思ったが理解した。

関数の呼び出しで
showDBConnectionDialog($path_my_app_data, "test")

のような形にすると、引数そのものが配列とみなされ、
第一引数にすべて集約されてしまう。

関数の呼び出しとしては
showDBConnectionDialog $path_my_app_data "test"


関数名(スペース)第一引数(スペース)第二引数・・・

が正しいのか。