えー!アスピリンの大きなボトルを私に渡してください!
Ansgar は、ペーストビンのバージョンと一致するようにオリジナルを編集したようです。それが正しい場合、このルーチンが機能する方法はないようです - 呼び出すかどうか...
この行
:no EXIT /B
動作しません。ラベル行のデータは無視されるためEXIT
、プロシージャを実行する方法はありません。これMUST
は次のように書けます
:no
EXIT /B
次の小さな問題は前の行です。PASCAL や DELPHI などの言語とは異なります。CALL
batch は、 、GOTO
EXIT
または END-OF-FILEに達するまで、行ごとに単純に実行します。関数や手順の意味での「ブロック」の概念はありません。ラベルは単なるマーカーです。
従って
GOTO no
余分です。or - の場合を除き、ラベルno
に到達します。また、を囲む括弧も冗長です。ANSWER
y
yes
GOTO yes
ENTER
次の小さな問題は、 a に応答してを押しSET/P
ても変数の値が変更されないことです。. set/p
.
answer
その結果、に設定する必要がありy
、応答すると に設定されたenter
ままになります- クリアされません。answer
y
answer
これを克服する方法は、実行する前に具体的に値を設定することですset/p
SET "ANSWER="
SET /P ANSWER=
しかし、よくあることですが、これは双方向です。コーディングする場合
SET "ANSWER=Y"
SET /P ANSWER="[%ANSWER%] "
次に、SET/P
プロンプトが表示されます[Y]
-引用符は、スペースを囲むためにここでのみ必要であることに注意してください. スペースが欲しくないですか?引用符を省略して...
今、これはおそらくより重要であり、name
そして-ああ-ああ-別のトラップのエントリです。date
とtime
は、必要な変数の論理名です。問題は、論理的すぎることです。彼らは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.txt
file.txt
それにもかかわらず、ルーチンは 3 つのデータ項目を要求し、この独特の構造を使用します。
ECHO |set /p =%name% %date% %time%>%0\..\file.txt
これは単に変数に何も応答しませんが、ファイルに送られるデータ行でプロンプトを表示します-新しいファイルを作成するか、既存のファイルを(再び)上書きします(単一>
は「新しいファイル内」を意味します)
次に、別のエントリを求めるプロンプトが表示されます。今回>>
はファイルに APPENDING ( ) です。
deleted
既存のファイルがある場合は、appended
すべてのデータラインを新しいファイルにすると、はるかに簡単になり>>
ます。ファイルがまだ存在しない場合は、ファイルが作成されます。
だから - ここに部分的な改訂があります。余分な括弧やGOTO
s を削除したり、 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
これが役に立つことを願っています!私は寝転びに出かけます。