0

だから... やあみんな。私は最も奇妙な問題を抱えています。テキストファイルを生成するこのバッチファイルを書きました

何らかの理由で本当にめちゃくちゃになる私のコードは次のとおりです。ここでより良いバージョンを見ることができます

@ECHO OFF

IF NOT EXIST file.txt goto generate
ECHO Erase the file>%0\..\file.txt

:generate
ECHO.
ECHO.
ECHO generating Table file for you
ECHO Please enter a name: 
SET /P name=

ECHO.

ECHO Please enter the date: 
SET /P date=

ECHO.

ECHO Please enter the time: 
SET /P time=

ECHO. 
ECHO.
ECHO Huzzah!

ECHO |set /p =%name%        %date%       %time%>%0\..\file.txt

:repeat
ECHO Do you want to add another entry? (Y/N) 
SET /P answer=
IF /i {%ANSWER%}=={y} (GOTO yes) 
IF /i {%ANSWER%}=={yes} (GOTO yes)
GOTO no

:no EXIT /B

:yes
ECHO.
ECHO.

ECHO Please enter a name: 
SET /P name=

ECHO.

ECHO Please enter the date: 
SET /P date=

ECHO.

ECHO Please enter the time:
SET /P time=

ECHO.
ECHO.
ECHO Huzzah!

ECHO.>>file.txt 
ECHO |set /p =%name%        %date%        %time%>>%0\..\file.txt
GOTO repeat

そしてそれはうまくいきます!ここに問題があります。このファイルを実行するだけではなく、別のファイルから実行したいのです。

私の他の.batにすっごく私はこの行を持っています

@call %0\..\generate_file.bat

繰り返しますが、うまく機能し、呼び出して実行し、エントリが1つしかない場合はすべて問題ありません...ただし、「はい」と入力して別のエントリを入力すると、新しい行は作成されず、追加され続けます古いエントリに新しいエントリ。ただし、generate_file.bat を単独で起動すると、意図したとおりに動作します。

アイデアはありますか?

4

2 に答える 2

1

えー!アスピリンの大きなボトルを私に渡してください!

Ansgar は、ペーストビンのバージョンと一致するようにオリジナルを編集したようです。それが正しい場合、このルーチンが機能する方法はないようです - 呼び出すかどうか...

この行

:no EXIT /B

動作しません。ラベル行のデータは無視されるためEXIT、プロシージャを実行する方法はありません。これMUSTは次のように書けます

:no
EXIT /B

次の小さな問題は前の行です。PASCAL や DELPHI などの言語とは異なります。CALLbatch は、 、GOTO EXITまたは END-OF-FILEに達するまで、行ごとに単純に実行します。関数や手順の意味での「ブロック」の概念はありません。ラベルは単なるマーカーです。

従って

GOTO no

余分です。or - の場合を除き、ラベルnoに到達します。また、を囲む括弧も冗長です。ANSWERyyesGOTO yes

ENTER次の小さな問題は、 a に応答してを押しSET/Pても変数の値が変更されないことです。. set/p.

answerその結果、に設定する必要がありy、応答すると に設定されたenterままになります- クリアされません。answeryanswer

これを克服する方法は、実行する前に具体的に値を設定することですset/p

SET "ANSWER="
SET /P ANSWER=

しかし、よくあることですが、これは双方向です。コーディングする場合

SET "ANSWER=Y"
SET /P ANSWER="[%ANSWER%] "

次に、SET/Pプロンプトが表示されます[Y]-引用符は、スペースを囲むためにここでのみ必要であることに注意してください. スペースが欲しくないですか?引用符を省略して...

今、これはおそらくより重要であり、nameそして-ああ-ああ-別のトラップのエントリです。datetimeは、必要な変数の論理名です。問題は、論理的すぎることです。彼らはmagic variables- そして、彼らを台無しにしないのが最善です.

通常の変数とまったく同じようにバッチプログラムで設定できますが、設定されていないmagic variable場合、システムはそれらを-まあ、魔法の値に設定します。もちろん魔法で。%date%日付、%time%時刻が含まれています-他にもたくさんあります-SET /?リストのプロンプトから参照してください。

マジック変数の問題は、(パラメータなしで) 実行して得られるシステム初期化変数のリストに表示されないことSETです! これらを変更するのも得策ではありません。バッチ プログラムは通常、その値を想定します。

現在、システムで初期化された変数の 1 つは、path明示的なパスが作成されておらず、現在のディレクトリにない場合に、実行可能ファイルを見つけるために検索されるディレクトリのリストです。

この最後の点は、%0\..\構成に関して重要です。" %0" 自体がバッチ ファイル名です。fred状況に応じて、またはfred.batまたはC:\somewhere\somewhereelse\fred.bat-多くの異なるものになる可能性があります。%0\..\file.txtしたがって、異なる可能性があります-file.txt現在のディレクトリが最も可能性が高いです。

したがって、元のバッチが現在のディレクトリに存在するかどうかを確認し、既に存在する場合file.txtはコメントErase the fileします-おそらく(現在のディレクトリに)-既存のファイルを上書きします。%0\..\file.txt.\file.txtfile.txt

それにもかかわらず、ルーチンは 3 つのデータ項目を要求し、この独特の構造を使用します。

ECHO |set /p =%name%        %date%       %time%>%0\..\file.txt

これは単に変数に何も応答しませんが、ファイルに送られるデータ行でプロンプトを表示します-新しいファイルを作成するか、既存のファイルを(再び)上書きします(単一>は「新しいファイル内」を意味します)

次に、別のエントリを求めるプロンプトが表示されます。今回>>はファイルに APPENDING ( ) です。

deleted既存のファイルがある場合は、appendedすべてのデータラインを新しいファイルにすると、はるかに簡単になり>>ます。ファイルがまだ存在しない場合は、ファイルが作成されます。

だから - ここに部分的な改訂があります。余分な括弧やGOTOs を削除したり、 s の前にデータ値をクリアまたはプリセットしSET /Pたり、プロンプトを組み込んだりしていません。変数名も残しました。

私が設定した方法に注意してください-一度設定すると、同じ文字列を常に繰り返すのではなくfilename、変数をファイルに使用できるようになります-ファイル名を変更することにした場合は面倒です...%filename%

@ECHO OFF
SET filename=%~dp0%file.txt
ECHO %filename%

IF NOT EXIST %filename% goto generate
ECHO Erase the file %filename%
DEL %filename%

:generate
ECHO.
ECHO.
ECHO generating Table file for you

:yes
ECHO Please enter a name: 
SET /P name=

ECHO.

ECHO Please enter the date: 
SET /P date=

ECHO.

ECHO Please enter the time: 
SET /P time=

ECHO. 
ECHO.
ECHO Huzzah!

ECHO(%name%        %date%       %time%>>%filename%

:repeat
ECHO Do you want to add another entry? (Y/N)
SET /P answer=
IF /i {%ANSWER%}=={y} (GOTO yes) 
IF /i {%ANSWER%}=={yes} (GOTO yes)
GOTO no

:no 
EXIT /B

これが役に立つことを願っています!私は寝転びに出かけます。

于 2013-06-11T05:54:28.153 に答える
0

これを置き換えます:

ECHO |set /p =%name%        %date%        %time%>>%0\..\file.txt

これとともに:

>>"%~dp0\file.txt" echo %name%        %date%        %time%

%0スクリプトファイルそのものです。%~dp0\file.txtの代わりに使用%0\..\file.txtして、同じフォルダー内のファイルにアクセスします。予期しないスペースによる驚きを避けるために、パスを二重引用符で囲みます。また、コマンドの前にリダイレクトを配置して、観察したような奇妙な出力リダイレクトの問題を回避します。

于 2013-06-10T22:12:29.493 に答える