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"
と
関数名(スペース)第一引数(スペース)第二引数・・・
が正しいのか。