コマンドプロンプトの echo がわけわからなすぎ
◆ 無理やり増設を繰り返したプログラムの末期感?
◆ エスケープが ^ だし オプションのエスケープは記号を挟むっていう変なことするし 一部の記号はファイルがあると動き違うし
◆ エスケープが ^ だし オプションのエスケープは記号を挟むっていう変なことするし 一部の記号はファイルがあると動き違うし
bat で echo を書こうとコマンドプロンプトで echo コマンドをいじってたのですが 意味不明すぎて関わりたくなくなるものでした
普通に出力
Linux とは違ってクオートしてもクオートごと表示されます
なんでも出るかというとパイプとかリダイレクトの記号は出ません
ちゃんとそれらの意味になります
コマンドプロンプトのエスケープは 「^」 なのでこの記号を使うと
文字として出ました
ではオプションだと?
これらを 「^/^?」 とか 「^on」 とかしてみても同様に echo コマンドのオプションとして解釈されます
こういう場合はまた特殊で リダイレクトみたいな意味を持たず コマンド名(ファイル名)として扱われない記号をスペースなしではさみます
最初に聞いたときには「なにいってんのこいつ」と思われてもおかしくないレベルです
スペースを入れて 「echo (/?」 のようにすると
のように表示されてしまうのでスペースは入れてはいけません
「~」や「*」や「_」などの記号の場合は 「echo~」 はコマンドとして認識されません というタイプのエラーです
「^」や「,」や「;」などの記号の場合は 「echo /?」 と一緒で使い方が表示されます
「&」だと 「echo」 単体と 「/?」 の 2 つのコマンドになって後者がエラーです
リダイレクトなども想像通りのエラーです
「ファイル名として扱われない」と書きましたが 正確には 「echo[」 や 「echo(」 などはファイル名にもできます
ファイルのパスに存在する「\」や「/」や「:」が使えない文字です
ですが 「echo+」 と言うファイル名があってもコマンドのほうが優先されるので特に問題はありませんでした
これで終わり
……かと思ったらまだありました
これらのコマンドを実行すると file.txt が関連付けられたもので起動します
file.txt がなければ echo となり文字列が出力されます
ファイルを開いた場合にはコマンドプロンプトには何も表示されません
「\..\」 なので上の階層のようにみえるのですが カレントディレクトリが対象になってます
とりあえず カッコ系と + と / が安全……かもれません
英語のページではバグでしょ とか そもそもコマンドプロンプトに仕様なんてなくって実際に動いたものの積み重ねが仕様みたいなものとかいろいろ書かれていました
互換性の関係で Windows のさらに前の PC から引き継いでるものみたいですね
Windows 10 ではもう古すぎるダメな仕様は捨てて作り直してくれてもよかったのですけどねー
PowerShell なんていらないものを作らずそのままコマンドプロンプトを改良してくれればいいのに
まあ Windows 7 や XP が良かったのにそのまま改善せずに全然違うものにして Vista や Windows 10 を作る会社ですから仕方ないのかも
しかも 未だに XP にパッチ配布してたりするくらいに古いものへのサポートが充実しすぎてますし
もうこれは逆効果で悪い意味になってる気もします(どうせパッチくるでしょと Windows 7 から乗り換えしない人増えそう)
またこの方法は 空文字の出力(改行のみ)にも使われます
「echo」 だけだと
と現在の echo の情報が表示されます
ということで ちょっとしたスクリプトでも php や Python で書いて実行するようにしてます
それでも Linux と違って実行環境がデフォルトであるわけじゃないので それらが使えないこともあります
VBScript や JScript と言う手もありますが 古すぎて辛いです
Windows 10 なら Edge のエンジンで JScript 使うのが楽ですけど Windows 7 もあるんですよね
(Edge のエンジンは JScript って呼んで良いのかな? ActiveX とか使えないし)
初期状態かつ自由にインストールできない Windows 8.1 以前の環境で使える簡単なスクリプトを実行できて書きやすい何かはないのかなー
普通に出力
> echo a
a
> echo あ
あ
a
> echo あ
あ
Linux とは違ってクオートしてもクオートごと表示されます
> echo "a"
"a"
> echo 'b'
'b'
> echo `c`
`c`
"a"
> echo 'b'
'b'
> echo `c`
`c`
なんでも出るかというとパイプとかリダイレクトの記号は出ません
ちゃんとそれらの意味になります
>echo a|b
'b' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
> echo a>b
> more b
a
'b' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
> echo a>b
> more b
a
コマンドプロンプトのエスケープは 「^」 なのでこの記号を使うと
> echo a^>b
a>b
> echo a^|b
a|b
a>b
> echo a^|b
a|b
文字として出ました
ではオプションだと?
> echo /?
メッセージを表示したり、コマンド エコーの ON と OFF を切り替えます。
ECHO [ON | OFF]
ECHO [メッセージ]
現在のエコー設定を表示するには、パラメーターを指定せずに ECHO と入力してください。
メッセージを表示したり、コマンド エコーの ON と OFF を切り替えます。
ECHO [ON | OFF]
ECHO [メッセージ]
現在のエコー設定を表示するには、パラメーターを指定せずに ECHO と入力してください。
> echo on
これらを 「^/^?」 とか 「^on」 とかしてみても同様に echo コマンドのオプションとして解釈されます
こういう場合はまた特殊で リダイレクトみたいな意味を持たず コマンド名(ファイル名)として扱われない記号をスペースなしではさみます
> echo\/?
/?
> echo./?
/?
> echo//?
/?
> echo+/?
/?
> echo:/?
/?
> echo(/?
/?
> echo[/?
/?
> echo]/?
/?
/?
> echo./?
/?
> echo//?
/?
> echo+/?
/?
> echo:/?
/?
> echo(/?
/?
> echo[/?
/?
> echo]/?
/?
最初に聞いたときには「なにいってんのこいつ」と思われてもおかしくないレベルです
スペースを入れて 「echo (/?」 のようにすると
> echo (/?
(/?
(/?
のように表示されてしまうのでスペースは入れてはいけません
「~」や「*」や「_」などの記号の場合は 「echo~」 はコマンドとして認識されません というタイプのエラーです
「^」や「,」や「;」などの記号の場合は 「echo /?」 と一緒で使い方が表示されます
「&」だと 「echo」 単体と 「/?」 の 2 つのコマンドになって後者がエラーです
リダイレクトなども想像通りのエラーです
「ファイル名として扱われない」と書きましたが 正確には 「echo[」 や 「echo(」 などはファイル名にもできます
ファイルのパスに存在する「\」や「/」や「:」が使えない文字です
ですが 「echo+」 と言うファイル名があってもコマンドのほうが優先されるので特に問題はありませんでした
これで終わり
……かと思ったらまだありました
> echo abc > file.txt
> echo:\..\file.txt
> echo\\..\file.txt
> echo.\..\file.txt
> echo:\..\file.txt
> echo\\..\file.txt
> echo.\..\file.txt
これらのコマンドを実行すると file.txt が関連付けられたもので起動します
file.txt がなければ echo となり文字列が出力されます
ファイルを開いた場合にはコマンドプロンプトには何も表示されません
「\..\」 なので上の階層のようにみえるのですが カレントディレクトリが対象になってます
とりあえず カッコ系と + と / が安全……かもれません
英語のページではバグでしょ とか そもそもコマンドプロンプトに仕様なんてなくって実際に動いたものの積み重ねが仕様みたいなものとかいろいろ書かれていました
互換性の関係で Windows のさらに前の PC から引き継いでるものみたいですね
Windows 10 ではもう古すぎるダメな仕様は捨てて作り直してくれてもよかったのですけどねー
PowerShell なんていらないものを作らずそのままコマンドプロンプトを改良してくれればいいのに
まあ Windows 7 や XP が良かったのにそのまま改善せずに全然違うものにして Vista や Windows 10 を作る会社ですから仕方ないのかも
しかも 未だに XP にパッチ配布してたりするくらいに古いものへのサポートが充実しすぎてますし
もうこれは逆効果で悪い意味になってる気もします(どうせパッチくるでしょと Windows 7 から乗り換えしない人増えそう)
またこの方法は 空文字の出力(改行のみ)にも使われます
「echo」 だけだと
> echo
ECHO は <ON> です。
ECHO は <ON> です。
と現在の echo の情報が表示されます
こんなの使いたくない
echo に限らず Windows の bat ファイルは色々辛くて(構文のわかりにくさや改行コードやエンコーディングの問題など)書きたくないのに 一番の基本になる echo ですらこれなんてもういやですということで ちょっとしたスクリプトでも php や Python で書いて実行するようにしてます
それでも Linux と違って実行環境がデフォルトであるわけじゃないので それらが使えないこともあります
VBScript や JScript と言う手もありますが 古すぎて辛いです
Windows 10 なら Edge のエンジンで JScript 使うのが楽ですけど Windows 7 もあるんですよね
(Edge のエンジンは JScript って呼んで良いのかな? ActiveX とか使えないし)
初期状態かつ自由にインストールできない Windows 8.1 以前の環境で使える簡単なスクリプトを実行できて書きやすい何かはないのかなー
COMMENT
コメント一覧 (5)
-
- 2017/07/05 16:53
-
\Windows\Micorosoft.NET\Framework\v4.0.30319 以下にある csc.exe を使うとC#コードをCLIでコンパイルできます。
Win7 SP1以降(でしたっけ?)なら .NET Framework 4.0が標準で入っているので初めから使えるはずです。
スクリプト、ではないですけど。
-
- 2017/07/07 01:29
-
csc って VisualStudio について入ってるのかと思っていました
最初からあるんですね
コマンドプロンプト代わりで C# コンパイルして実行はちょっと重すぎ感もありますけどありかもしれません
-
- 2017/08/21 19:38
-
>Windows 10 ではもう古すぎるダメな仕様は捨てて作り直してくれてもよかったのですけどねー
>PowerShell なんていらないものを作らずそのままコマンドプロンプトを改良してくれればいいのに
コマンドプロンプトはMS-DOSのCOMMAND.COM互換シェル環境なので過去仕様が切り捨てられることはまずないでしょう。
Windows2000で少し機能拡張されてはいますが…
PowerShellはWindowsをCLIから管理するためのもので、そもそも作られた目的が違います。
-
- 2017/09/20 21:29
-
> MS-DOSのCOMMAND.COM互換シェル環境なので過去仕様が切り捨てられることはまずないでしょう
やっぱりそうですかぁ
コマンドプロンプトは互換用でそのままとしても使いやすいコマンドプロンプトとして新しいソフトが出てほしいんですよね
そういえば bash on windows とかありますし それが進化したコマンドプロンプト的な立ち位置にするんでしょうか
> PowerShellはWindowsをCLIから管理するためのもので、そもそも作られた目的が違います。
コマンドプロンプトでもコマンドを実行してプログラムの起動やタスク管理や設定の変更などができるので Windows の管理をしているように思えます
よりコアな部分の操作ができるようになったのだとしてもコマンドプロンプトの良いところは引き継いで進化系として使いやすくなっていてもよかったのですけどねー
-
- 2018/10/16 13:11
- そんなあなたにbusybox