その他

コマンドプロンプト、batファイルの実行結果に謎の長文のテキストが出力されるのは何故?[No40]

スポンサーリンク

バッチファイルを作成していたら、何故か謎の長文の文章が出力されてしまいました。いきなり身に覚えのない長文テキストが表示されると、何事かと焦りますよね。私と同じような体験をした人もいるのではないでしょうか。

どうして突然謎の長文テキストが出力されてしまうのか、その原因について調査したので、今回は調査の経緯から結果、そして対策まで含めて紹介したいと思います。

調査経緯

プログラム1(chcp 932)

私の困っていたプログラムを簡略化すると次のようになります。


@echo off

echo;
set /p var=""/?""

pause

実行結果1(chcp 932)

下の画像のように、「cmd.exe 環境変数を表示、設定、または削除します。」から始まる長文が出力・表示されてしまいました。


cmd.exe 環境変数を表示、設定、または削除します。
・・・

スポンサーリンク

プログラム2(chcp 65001)

英語でプログラムを実行した場合も紹介します。


@echo off
chcp 65001

echo;
set /p var=""/?""

pause

実行結果2(chcp 65001)

下の画像のように「Displays, sets, or removes cmd.exe environment variables.」から始まる長文が出力・表示されてしまいました。


Displays, sets, or removes cmd.exe environment variables.
・・・

関連記事

no image
コマンドプロンプトのコマンド一覧、各コマンドのHELP(詳細)をファイル出力するBATプログラムの紹介[No38]
コマンドプロンプトで実行できるコマンドには外部コマンドと内部コマンドがあります。内部コマンドは「HELP」(ヘルプ、詳細)をコマンドを実行して一覧で確認できます。 そして、コードペー ...

スポンサーリンク

期待していた実行結果

プログラム3

イメージとしては、次項の「調査結果」の画像のように「/?」だけ表示するようにしたいと思っていました。(ここでは「please,input.」としています。)


@echo off

echo;
set /p var="please,input."

pause

実行結果3

調査結果

謎の長文は「/?」で表示された結果でした。「/?」(「/?」)をコマンドの近くに書くと、HELPコマンドの「コマンドの詳細、ヘルプ」を出力・表示します。

次のように「set /p var=""/?""」を「set /p var="/?"」に変更すると、画像のように「/?」と表示させることができます。

このことから、謎の長文が出力されてしまった原因は、「set /p var=""/?""」が1つ目の「""」の直後で区切られ、後の「/?""」は「set /?""」のように認識されたからではないかと考えられます。

(恐らく「(set /p var="") (/?"")」のようにダブルクォーテーション「"」を2つ使うことで「空文字」を代入したと誤認しています。)


@echo off

echo;
set /p var="/?"

pause

スポンサーリンク

対策

  • 「/?」(「/?」)をバッチファイル内で使う場合は、「/?」より前に「"・・・"」(ダブルクォーテーション)が2つ無いようにする。
  • 引数にダブルクォーテーションが使われる場合は、引数の前後にだけ使うようにする。
  • ダブルクォーテーションが連続しなくても、「何かのコマンド "文字列1"文字列2"文字列3"」のような場合、「文字列1」で区切られてしまって同様の誤認が起き、謎の長文が出力されてしまう可能性があるため気をつける。
  • プログラムを作成したら、一見ダブルクォーテーションが連続して使われていないように見えても、「SET var="文字";set /p var="%var%"」のように結果的に連続してしまうことにならないようにする。
  • 謎の長文が出力された場合は、まず「/?」をテキスト検索する。「/?」が使われていた場合は、謎の長文が「同じ行にあるコマンドのヘルプ」ではないか確認する。
  • 「SET」でサイトURLを扱う時はURLをダブルクォーテーションで囲むため、特に気を付ける。

※今回の紹介では「SET」を使いましたが、次のコマンドでも謎の長文が出力される可能性があるため注意が必要です。

「ASSOC,ATTRIB,BREAK,BCDEDIT,CACLS,CALL,CD,CHCP,CHDIR,CHKDSK,CHKNTFS,CLS,CMD,COLOR,COMP,COMPACT,CONVERT,COPY,DATE,DEL,DIR,DISKPART,DOSKEY,DRIVERQUERY,ECHO,ENDLOCAL,ERASE,EXIT,FC,FIND,FINDSTR,FOR,FORMAT,FSUTIL,FTYPE,GOTO,GPRESULT,GRAFTABL,HELP,ICACLS,IF,LABEL,MD,MKDIR,MKLINK,MODE,MORE,MOVE,OPENFILES,PATH,PAUSE,POPD,PRINT,PROMPT,PUSHD,RD,RECOVER,REM,REN,RENAME,REPLACE,RMDIR,ROBOCOPY,SET,SETLOCAL,SC,SCHTASKS,SHIFT,SHUTDOWN,SORT,START,SUBST,SYSTEMINFO,TASKLIST,TASKKILL,TIME,TITLE,TREE,TYPE,VER,VERIFY,VOL,XCOPY,WMIC」

雑記

先日、大相撲7月場所が千秋楽を迎えましたが、ご覧になりましたか?

今回は平幕・照ノ富士が格上の関脇・御嶽海を寄り切って優勝となりました。平幕の優勝に世間は賑わいましたが、照ノ富士は元大関であるという点でも注目を集めています。実は、大関経験者が一度転落した後に優勝まで漕ぎ着けたというのは、1976年の秋場所で優勝を果たした魁傑以来、歴代2人目という快挙なのです。照ノ富士は今回、他にも殊勲賞と技能賞を獲得しており、大関を退いてからの30幕あまりの努力が身を結んだと言って良いでしょう。幕内から序二段まで陥落するという悔しさをバネに照ノ富士が追い上げを見せる様は、見ているこちらも手に汗握る展開でした。

私たちも日頃の負の経験をプラスに生かした生活を送りたいですね。

最後までお付き合いいただきありがとうございます!

この情報が誰かの役にたてれば幸いです。

スポンサーリンク

-その他