3
5

More than 3 years have passed since last update.

tnsnames.oraを探すスクリプト

Last updated at Posted at 2020-12-29

はじめに

職場の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がどこにあるのかを探すスクリプトを作ってみました。

tnspingの結果
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が無い時は、処理を中断しています。
find_tnsnames_ora.ps1
# ------------------------------------------------------------------------------
# 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
処理が完了しました...:

参考URL

3
5
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
3
5