web-dev-qa-db-ja.com

エコーはオフですが、メッセージが表示されます

Batファイルのエコーをオフにしました。

@echo off

それから私はこのようなことをします

...
echo %INSTALL_PATH%
if exist %INSTALL_PATH%(
echo 222
...
)

そして私は得る:

システムは指定されたパスを見つけることができません。

これら2つのエコー間のメッセージ。

このメッセージの理由は何ですか?また、メッセージがエコーオフを無視する理由は何ですか?

66

Mike Nakis が言ったように、echo offは結果の出力ではなく、コマンドの出力のみを防ぎます。コマンドの結果を非表示にするには、行末に>nulを追加し、エラーを非表示にするには2>nulを追加します。例えば:

Del /Q *.tmp >nul 2>nul

Krister Andersson のように、エラーが発生する理由は、変数がスペースで展開されているためです:

set INSTALL_PATH=C:\My App\Installer
if exist %INSTALL_PATH% (

になる:

if exist C:\My App\Installer (

つまり:

「C:\ My」が存在する場合、コマンドライン引数として「(」を指定して「App\Installer」を実行します。

「App」という名前のフォルダーがないため、エラーが表示されます。この分割を防ぐために、パスを引用符で囲みます。

109
Hand-E-Food

これを* .batファイルとして保存し、違いを確認します

:: print echo command and its output
echo 1

:: does not print echo command just its output
@echo 2

:: print dir command but not its output
dir > null

:: does not print dir command nor its output
@dir c:\ > null

:: does not print echo (and all other commands) but print its output
@echo off
echo 3

@echo on
REM this comment will appear in console if 'echo off' was not set

@set /p pressedKey=Press any key to exit
35
Wakan Tanka

「エコーオフ」は無視されません。 「エコーオフ」は、コマンドをエコーし​​たくないことを意味し、コマンドによって生成されたエラーについては何も言いません。

あなたが私たちに示した行は大丈夫に見えるので、問題はおそらくそこにありません。それで、私たちにもっと行を見せてください。また、INSTALL_PATHの正確な値を表示してください。

10
Mike Nakis
@echo off
// quote the path or else it won't work if there are spaces in the path
SET INSTALL_PATH="c:\\etc etc\\test";
if exist %INSTALL_PATH% (
   //
   echo 222;
)
4
Cyclonecode

私にとって、この問題はファイルのエンコード形式が間違っていたことが原因でした。別のエディターを使用し、UTF-8-BOMとして保存されたため、最初の行は@echo offでしたが、その前に隠し文字がありました。

そこで、エンコードをプレーンなANSIテキストに変更すると、問題はなくなりました。

3