はじめに
職場のOracleクライアントがインストールされているPCで、「どこにtnsnames.oraがあるか分からない」ということが何度かありました。
Oracleのバージョンによって、あるいはインストール時に指定したフォルダによってtnsnames.oraがあるフォルダパスが異なるため、tnsnames.oraを探すスクリプトを作ってみました。
着眼点
こちらのページを見ると、以下のように書かれています。
しかし、コマンドプロンプトのSET
コマンドで探してもORACLE_HOME
という環境変数がないため、別の方法でtnsnames.oraを探すことにしました。
次の場所にtnsnames.oraファイルが作成されます。
ORACLE_HOME\network\admin\tnsnames.ora
次にこちらのページを見てみると、tnsping
というコマンドを実行した際に返されるパス上にtnsnames.oraがあると書かれていました。
実際に試してみると以下の結果が返されて、実際にC:\app\NKOJIMA\product\11.2.0\client_1\network\admin\
上にtnsnames.oraが存在していました。
そこでtnsping
コマンドの結果を使って、tnsnames.oraがどこにあるのかを探すスクリプトを作ってみました。
C:\Users\NKOJIMA>tnsping aaa
TNS Ping Utility for 32-bit Windows: Version 11.2.0.4.0 - Production on 29-12月-2020 19:45:28
Copyright (c) 1997, 2013, Oracle. All rights reserved.
パラメータ・ファイルを使用しました:
C:\app\NKOJIMA\product\11.2.0\client_1\network\admin\sqlnet.ora
TNS-03505: 名前の解決に失敗しました。
作成したスクリプト
- 最初に
tnsping
コマンドの存在を確認して、tnsping
コマンドがなければ処理をOracleクライアントがインストールされていないとみなして、処理を中断します。 - 次に
tnsping
コマンドの結果からsqlnet.oraのフォルダパスを取得して、そのフォルダパス上にtnsnames.oraがあるかどうかを調べています。- tnsname.oraが見つかった時は、そのファイルパスをコンソールに出力します。
- このフォルダにtnsnames.oraが無い時は、処理を中断しています。
# ------------------------------------------------------------------------------
# tnsnames.oraの保管場所を探すスクリプト
# ------------------------------------------------------------------------------
Write-Host 'tnsnames.oraの保管場所を探索します...'
try {
# 1. tnspingコマンドの存在(=Oracleクライアントの存在)を確認する。
# tnspingコマンドが無い場合はエラーとなるため、catch句に飛ばされる。
# ※「-ErrorAction "Stop"」を付けることで、終了しないエラー(Non-terminating Errors)をcatch句で補足できるようにしている。
$tnsPing = Get-Command tnsping -ErrorAction "Stop"
}
catch
{
Write-Host 'Oracleクライアントがインストールされているか確認してください。'
exit
}
# 2. tnspingコマンドの実行結果から、sqlnet.oraのパスを取得する。
$pingResult = tnsping aaa
$pingResultArray = $pingResult.Split("`r`n")
$existsTnsnames = $false
foreach ($row in $pingResultArray)
{
if ( $row -like '*sqlnet.ora')
{
# 3. sqlnet.oraの保管フォルダにtnsnames.oraがあるかを確認する。
$tnsnamesPath = Join-Path (Split-Path -Parent $row) tnsnames.ora
if (Test-Path $tnsnamesPath)
{
Write-Host 'tnsnames.oraは以下の場所にありました。'
Write-Host $tnsnamesPath
$existsTnsnames = $true
}
}
}
# 4. sqlnet.oraの保管フォルダにtnsnames.oraが見つからない時は、tnsnames.oraの探索を終了する。
if (!$existsTnsnames)
{
Write-Host 'tnsnames.oraは見つかりませんでした。'
}
Read-Host "処理が完了しました..."
tnsnames.oraの保管場所を探索します...
tnsnames.oraは以下の場所にありました。
C:\app\NKOJIMA\product\11.2.0\client_1\network\admin\tnsnames.ora
処理が完了しました...: