Windows: 2026年7月アーカイブ

A5:SQL Mk-2 で Oracle Database に接続しようとしたところ、

NET: Network error (Cannot connect to server on host 'localhost':
対象のコンピューターによって拒否されたため、接続できませんでした。.
Socket Error Code: 10061($274D))
<Host = localhost:1521>

というエラーになってつながらない。

タスクマネージャーで見てみたら、確かに Oracle 関係が全然起動していない。

そこで、タスクマネージャーからサービス管理ツールを開き、「OracleOraDB21Home1TNSListener」を実行しようとすると、

ローカルコンピューターの OracleOraDB21Home1TNSListener サービスを開始できません。

エラー 1069: ログオンに失敗したため、サービスを開始できませんでした。

とエラーが出て起動できず・・・

20260703_taskmane4.jpg

Oracle の SYSTEM と SYS アカウントのパスワードを変更したのでそのせいかと思い(「Oracle Database 21c Express Edition (XE) をインストール」参照)OracleOraDB21Home1TNSListener のプロパティを開いて「ログオン」タブ選択。そこで新しいパスワード 'testpass01' をパスワードに入力したら、うまく起動するようになった。

20260703_taskmane7.jpg

・・・が、パスワードを変更したのは一昨日であり、昨日は正常に起動したぞ?

そもそも、「ログオン」タブの「アカウント」に入ってる「NT SERVICE\OracleOraDB21Home1TNSListener」って何?これ、アカウント???

Gemini君によるとこれは「仮想アカウント(Virtual Account)」と呼ばれる、Windowsがサービス専用に自動で管理してくれる特殊なアカウントで、通常 Windowsが裏側でパスワードを自動管理しているため、人間が手動でパスワードを入力する必要がなく、プロパティの画面ではパスワード欄は空にしとけばいいらしい。

なるほど。パスワードの確認欄があったのはそのせいね(^^;;; 俺は、単に NT SERVICE\OracleOraDB21Home1TNSListener アカウントの「新しいパスワード」を 'testpass01' にしただけの話か・・・(^^;;;

今度同様の状況になったら、その時にはパスワードには空値を設定しよう(笑)
あと、Windowsバッチ(.BAT)の書き方で違和感があるのが、ダブルクォーテーションの扱いである。

エスケープしない限り、ダブルクォーテーションは文字としてそのまま使われることはなく、文字列の範囲指定、つまり引用符(ダブルクォーテーションで囲んだ中身が有効)として使われる・・・という認識なんだけど Windowsバッチでは違う。

例えば Perl で

my $a = "ABC";
if ("$a" eq "ABC") { print "ok!"; }

としたとき(まあ、変数をわざわざ "" で囲むことはないけど、例としてね)、比較されるのは $a変数に収められた ABC という文字列と、"" で囲まれた ABC という文字列である。決して、"ABC" と "ABC" が比較されるわけではない。
"" とすれば、それはダブルクォーテーションで囲まれた文字が何もない(空文字)ということになる。

ところが Windowsバッチで、

IF %1 == "ABC" ( ECHO 同じです ) ELSE ( ECHO 違います )

なんて書いて引数に ABC を指定して' test.bat ABC 'ってバッチを起動すると「違います」と言われる。「え?"ABC" と "ABC" なのに?」でも、実際は ABC と "ABC" の比較になってるのだ。
改めて、' test.bat "ABC" 'と実行すれば、これは「同じです」と返ってくる。ダブルクォーテーションも単なる文字として判断されているので、これなら "ABC" と "ABC" の比較となるからだ。

上記の IF 文で、引数に何も指定しなければ「"ABC" の使い方が誤っています。」というエラーになる。

この場合、%1 は「空文字」ではなく「無」な状態となり、変数展開後、

IF == "ABC" ( ECHO 同じです ) ELSE ( ECHO 違います )

と書いたのと同じことになるのだ。書式として誤った形になっている。なんか気持ち悪い(^^;;;

なので、正しい対応(あとで書くが、これは単なる慣習である)

IF "%1" == "ABC" ( ECHO 同じです ) ELSE ( ECHO 違います )

と書く。そうすると、引数が指定されなかったときは、

IF "" == "ABC" ( ECHO 同じです ) ELSE ( ECHO 違います )

と書いたのと同じになるので、書式として正しい。む~ん・・・

上の例は、まるで変数や文字列を二重引用符(ダブルクォーテーション)で囲ったように見えるが、これは実は引用符ではない。そもそも、Windowsバッチには引用符という概念がない。

これは実際には

IF X%1X == XABCX ( ECHO 同じです ) ELSE ( ECHO 違います )

のように、ダブルクオーテーションではなくても良い。%1 が「無」の状態とならなければいいのだ。だから囲ってやる必要もなく、

IF X%1 == XABC ( ECHO 同じです ) ELSE ( ECHO 違います )

でいい。%1が空だったときに、何かしらの値がそこに残ればいいのだ。上の例であれば、「IF X == XABC」となり書式としては成立している。そこを「頭に X を置くのでは見栄えも悪いし」ということで、慣習的にダブルクォーテーションで囲っているだけの話だ。

この辺が日ごろ Windowsバッチに触れてない人間には気持ちが悪いのよね。

「引用符の概念がない」のもそうだけど、そのため空文字対策で変数を何らかの文字で囲ってやらないといけないときは慣習的にダブルクォーテーションを使う(人が多い)。これが俺のようにたまにしか Windowsバッチに触れない人間には「変数を引用符で囲む必要ないんじゃないの?」とトラブルの元となってしまうのである。

もう!ほんま Microsoft の設計思想、嫌い(^^;;; なんでこんな仕様にした?
Windows(てか、DOSって書いた方が正解?)のバッチファイル(BAT ファイル)を久しぶりに書かないといけなくなった。

つーか、「久しぶり」ってのがウソで、正直言うと自分で一から BAT ファイルを書いたことはほとんどない。そういう仕事を受けたことがないもんで。だいたい UNIX 系が多かったからなあ。

とりあえずメモしとく。

IF 文の ELSE は、必ず ") ELSE (" と書かないといけない。")" の後ろで改行して "ELSE" を書くとエラーとなる。
ELSE を独立した命令と判断し

'ELSE' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

なんてことに・・・

まあ、「先頭に英字の文言が出てきたら命令と判断する」って単純な仕様なんだろうが、それにしてもなんだかなあ・・・

俺はそもそも if と else を同じ面で合わせたいので、

if (hoge) {
    hogehoge;
}
else {
    monyomonyo;
}

という書き方派なのよ。多分、(特に UNIX 系のプログラマは)

if (hoge) {
    hogehoge;
} else {
    monyomonyo;
}

って書きたい派が多いと思うけど。(なんとなく、ネット上のソースなんかを見ると)

でも、bash スクリプトでも

if [[ "$a" == "y" ]]; then
    echo "あなたはやましろしんご";
else
    echo "あなたはやなぎさわしんご";
fi

って書くでしょ?やっぱ ELSE の面は IF と合わせたいのよね、生理的に(笑)

このアーカイブについて

このページには、2026年7月以降に書かれたブログ記事のうちWindowsカテゴリに属しているものが含まれています。

前のアーカイブはWindows: 2026年6月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

月別 アーカイブ

電気ウナギ的○○ mobile ver.

携帯版「電気ウナギ的○○」はこちら