2016-10-05 6 views
0

に追加されます:ECHOがオフに私はバッチファイルに次のコード持っているテキストファイル

rem capture the date/time(right down to the second) and then assign it to a variable 
set yy=%date:~-4% 
set dd=%date:~-7,2% 
set mm=%date:~-10,2% 
set newdate=%dd%%mm%%yy%_%Time:~0,8% 
set newdate=%newdate::=% 
set foldername=svetlana_backup_%newdate% 
set foldername=%foldername: =% 

set destination=R:\Backup 

if exist %destination% (
    rem do stuff if destination exists. 
) else (
    call:GenerateErrorLog "%destination% not found." 
) 


:GenerateErrorLog 
echo %~1 >> error_log_%foldername%.txt 
goto:eof 

それは、次のテキストファイルを生成します。

R:\Backup not found. 
ECHO is off. 

なぜそれがECHOを印刷んがオフになっているし、そしてどのように私はそれを防ぐのですか?

+1

は' GOTOを入れてください。しかし、私はあなたのログファイルにそれをエコーするためにラベルに呼び出す必要がある理由は何も見ていません。 'ELSE'節にエコーを入れないのはなぜですか? – Squashman

+0

@Squashman - バッチファイルは、私がここに投稿したものよりもはるかに大きいです。無関係なコードを取り出して投稿しました。エラーをエコーするelse節がたくさんあるので、私は関数を作成することにしました。 – AnnabelleRosemond

+0

あなたはすべての関数がバッチファイルの最後にあるべきであることを理解しています。また、すべての関数の前に行として 'GOTO:EOF'または' EXIT/B'を置く必要があります。すべての機能を再度実行するには? – Squashman

答えて

3

値が%~1であるため、echoはそのステータスを報告します。修正するには

:使用echo(echo[Space]の代わりに - ネストされたルーチンの括弧カウントで(劇がない部分が、空の引数{}癖

+0

どのような変態!ただお気に入り! –

+1

それは技術的には原因ですが、本当に使用すべきものは、 'IF..ELSE'節の後に' GOTO:EOF'があるので、 'echo%1'を二度実行しません。 – Squashman

+0

@スカッシュマン - 私はちょうどこれをテストした、それは働いた! – AnnabelleRosemond

1

としてのためechoレポートを抑制することが見出されています@Squashmanがすでにcommentsで指摘されている場合は、スクリプトのメインセクションが終了した後で、意図せずにサブルーチン: GenerateErrorLogを実行しないようにする必要があります。

ECHO is off.メッセージの技術的な原因は、すでに@Magooanswerで説明されています。

しかし、なぜ%~1は空ですが、呼び出しコマンドラインcall:GenerateErrorLog "%destination% not found."は空の引数ではありませんか?これは、バッチファイルの処理方法です:他の(真の)プログラミング言語のような実際の関数とサブルーチンはありません。バッチファイルはファイル全体を上から下へ行単位で実行するように設計されています。実行フローまたはダイレクトリーンを変更する方法はごくわずかです(if,forgotocall&&||)。コードの特定の部分を実行しないようにするには、明示的に制御する必要があります。だからあなたのコードでは、if exist句の実行がサブルーチンを構成する次の行で実行されるので、これはメインセクションの一部として実行されます。したがって、%~1はサブルーチンの最初の引数ではなく、バッチスクリプト全体のものと見なされます。そのようなものを指定しないと、%~1は空の文字列に展開されます。

あなたは単にあなたがあなたのバッチファイルを呼び出す場合ということを証明することができます - 私たちはscript.batそれを呼びましょう - コマンドプロンプトウィンドウ(スクリプトを含むディレクトリをポイント)から、引数を提供することにより:

script.bat ##TEST## 

これは、(代わりにECHO is off.の)次のログエントリになります。だから、もう一度

##TEST## 

:を追加しますあなたのバッチスクリプトのメインセクションの終わりにかexit /B: `IF ELSE`句の最後の括弧の後にEOF`:

:: /* initial code... */ 
if exist %destination% (
    rem do stuff if destination exists. 
) else (
    call:GenerateErrorLog "%destination% not found." 
) 
goto :EOF 

:GenerateErrorLog 
:: /* remaining code... */ 
関連する問題