INASOFT 管理人のひとこと


フリーソフトダウンロードサイト「INASOFT」の管理人 矢吹拓也 が日々の「ひとこと」を語るページです。
2021年1月1日より、旧ブログ(blog.inasoft.org)からお引越ししました。
・INASOFT Webサイト: https://www.inasoft.org/
・管理人のふたこと(長文記事/寄稿文): https://www.inasoft.org/talk/
2022年7月下旬より再び本業多忙化してきているため、更新頻度は落ちます。 [2022/7/24 19:32]

目次 | ←前へ / 2016-12-29 09:32 / 次へ→ / 最新へ⇒

■環境変数COMSPECとコマンドラインシェルとPowerShell

2016年12月29日(木) 9:32:42 [さくらのブログから転記]



RSSRSS配信中
https://www.inasoft.org/



12月12日に、コマンドプロンプトが無くなるという話題が出てきて一時騒然という話題を出しました。このときは、コマンドプロンプトが無くなるわけではなく、デフォルトのコマンドラインシェルがPowerShellに置き換わるらしいという話で落ち着いたことを書きました。

おそらく、スタートメニューからのリンクが「コマンド プロンプト(CMD.EXE)」から「パワーシェル(PowerShell.exe)」に変わるとか、環境変数COMSPECがPowerShell.exeへのパスに変わるのか…といった予想を書きました。

最近のInsider Previewを試した人の話によると、スタートボタンを右クリック or Windows+Xキーを押したときに表示される「コマンドプロンプト」へのリンクは「PowerShell」に変更になったが、環境変数COMSPECは依然としてCMD.EXEのままであったとのことです。

なお、これを変更するための設定は「タスクバー」の設定内に、現バージョンでもすでに準備されており、それのデフォルトが「PowerShell」側に置き換わっただけというだけのこと.

tskbar_cmd.png

というわけで、CMD.EXEを利用するプログラムも書いたことがあるプログラマとしては一安心だったのですが、これを調べる過程で、ちょっと怖いテクニックを紹介しているページがあって慌てています。

どこに恐怖したかというと、環境変数COMSPECをPowerShellに変更するというテクニックを紹介しているところですね。

これをやっている人が世の中にどれだけいるか、わからないけど、少なくともこれを実践している人がいると、当サイトで作っているソフトウェアのうち、環境変数COMSPEC経由でコマンドプロンプトを呼び、内部コマンドを使用しているものは、うまく動作しなくなるということ。

例えば、「改行コード変換Lite」は、各機能がGUIプログラムとは独立に子プログラムとして作られており、GUIプログラムはCMD.EXE用のコマンドラインを生成して子プログラムを実行する仕組みになっています。

このとき、一時停止には内部コマンドPAUSEを使っているし、複数ファイル処理するときには内部コマンドFORを使っています。

PowerShellにPAUSEはありませんし、FORの書式は全く違うものになっていますから、このままでは「改行コード変換Lite」は動作しなくなってしまいます。

環境変数COMSPECをPowerShellに変更するテクニックを実践している人は「改行コード変換Lite」が使えないことになってしまいます。

まぁ、そんな特異なことをしている人は自業自得だ・・・と言ってしまえばソレまでなのですが、うまく動作しない原因が環境変数COMSPECをPowerShellに変更するテクニックを実践しているためだと気づける人の方が希だと思いますので、それに気づかせるための手立てを準備するか、あるいは解決策を準備する必要があるかもしれません。

(作者にクレームが来れば気づかせて上げることもできるかもしれませんが、昨今では作者にクレームを入れるのではなく、2chやTwitter上で騒ぎ立てるだけ騒ぎ立ててオシマイで解決せず、作者だけが悪者になっているケースもあったりしますから、慎重に考えなければなりません)

例えば、COMSPEC内にCOMMAND.COMでもなく、CMD.EXEでもない文字列が入っていたら・・・、あるいはPowerShell.exeのような文字列が入っていたら起動時に警告メッセージを出力するとか。

あるいは、デフォルトではコマンドラインシェルを環境変数COMSPEC依存とするが、設定変更により自由にコマンドラインシェルを選べるようにする(C:\Windows\System32\Cmd.exeを直指定できるようにする)とか。

一般的に、こういったプログラムを書くときは、環境変数経由でファイル名を指定してやるのがキレイなことで、逆に直指定は汚いことであるというのが共通理解かと思うのですが、環境変数COMSPECに依存するとこんな落とし穴にハマってしまうとは、プログラムを書いていたときには全く気づきませんでした…。


【追記】

ちょっと書き方が足りなかったみたいで、一部誤解があるみたいなので追記。

こちらのMSDNのサイトにもある通り、通常のコマンドラインシェルは、Windows 9xではcommand.com、Windows NT系ではCMD.EXEとなっていて、環境により標準のコマンドラインシェルの名前が異なっているという事情があります。

もちろん、Windows NTにも互換性のためのcommand.comはある(あった)けど、フルパワーのものではない。

そんな歴史があるので、そもそもCMD.EXEの決め打ち自体が望ましくないって事情が、そもそも存在する。その環境でのコマンドラインシェルの名前を示しているのがCOMSPECなので、コマンドラインシェルを知りたければCOMSPECを使おう、という順序で考えるのが、そもそもの正しい考え順。

で、CMD.EXEはcommand.comの上位互換を保っていたから、これまでその考えでうまくいっていたんだが、先に示した通り、上位互換のないPowerShellを指定するテクニックを紹介しているサイトがあるとなると、その前提が崩れるのでCMD.EXEの決め打ちも手段の一つとして出てくる。

なので、CMD.EXE決め打ちが最も優れた手段というわけではないのがスタート地点なので、そこのところは見誤らないようにしていただきたいです。



目次 | ←前へ / 2016-12-29 09:32 / 次へ→ / 最新へ⇒


目次の表示:


ブログではないので、コメント機能とトラックバック機能は提供していません。ご質問・ご意見等はメールフィードバックまたはTwitter等からお願いします。いただいたご質問・ご意見などは、この「管理人のひとこと」の記事に追加、あるいは新規の記事にする形で一部または全文をそのまま、あるいは加工させていただいた上で、ご紹介させていただく場合があります。
当サイトでは掲載内容による不具合等に関する責任を持ちません。また、内容の正確性についての保証もありませんので、情報をご利用の際は、利用者の自己責任で確認をお願いします。本ページは公開から1年半後の任意のタイミングで削除される予定です。


- 最近の更新 -



3126625 (+0980)[+0736]

Copyright© 2010-2024 INASOFT