1

私が正しくしようとしているプログラムのプロセスは、多数の単語を含むテキストファイルを取得し、それぞれを変数に設定し、リストセットからランダム変数をエコーすることです。これまでのところ、私のコードは次のようになります。

@Echo Off
Set _InputFile=config.txt
//Sets the Input file
For /F "tokens=1,2* delims=:" %%A IN (%_InputFile%) DO Set _Data%%A=%%B
//Sets each Word to a vairable from _data1 to _datax
set n=(random number code)
//Set's N to be a rational random number depending on the variables available
Echo _data%%n
//This is where i get stuck, i need to be able to echo _data(whatever number n is)
pause>nul

したがって、基本的に私の主な問題は、別の変数の値に基づいてランダム変数をファイルにエコーさせることです。私が試している方法よりも優れている/適切である場合は、別の方法もいただければ幸いです。

次に (小さな問題ですが)、config.txt 内の単語数 (または行数は同じであるため) を決定し、その数を変数に代入する方法はありますか?

4

2 に答える 2

3

1)CALLを使用して、2つの拡張フェーズを取得します。1つは呼び出し前、もう1つは呼び出し後です。これは遅く、視覚的に混乱します。また、多くのキャラクターが結果を破壊する能力を持っているため、信頼性が最も低くなります。

call echo %%_Data%n%%%

2)拡張の遅延-常に機能する方法をはるかに高速に、より簡単に実行できます。ただし、FOR変数に文字が含まれている場合、拡張の遅延によりFOR変数の拡張が破損します!。遅延拡張は、使用する前に有効にする必要があります。

setlocal enableDelayedExpansion
::Above line must be executed sometime before the following
echo !_Data%n%!

2a)n変数が、値をエコーし​​ようとしているのと同じ括弧で囲まれたコードブロック内に設定されている場合、は機能し%n%ません。この問題は、FORループとIFステートメントでよく発生します。%n%nの値が設定される前に、ブロック全体が解析されるときに展開されるため、失敗します。秘訣は、の値を!n!FOR変数に転送することです。

setlocal enableDelayedExpansion
for .... (
  set n = ....
  for %%N in (!n!) do echo !_Data%%N!
)

これは、1からxまでの疑似乱数を取得するための便利な方法です。これは、事前定義された動的変数RANDOMに依存しています。

set /a n=%random% %% x + 1

ループで値を計算する場合は、反復ごとに異なる数を取得できるように、拡張を遅らせる必要があります。

set /a n=!random! %% x + 1
于 2012-09-11T22:24:20.760 に答える
1

最初に 2 番目の質問に答えるために、ファイル内の行数をすばやく取得する方法がいくつかあります。

メソッドの使用FIND.EXE:

for /f %%x in ('type %FileName% ^| find /v /c ""') do set Lines=%%x

を使用する利点は、find.exemad のような任意のテキスト ファイルから zipps を検索し、空白行もカウントすることです。

メソッドの使用for:

for /f %%x in (%FileName%) do set /a count=count+1

2 番目の方法の欠点は、forループが自動的に空白行をスキップすることです。この方法の利点は、ファイルに 1 回アクセスするだけでよいことです。

ファイルの各行を読み込んで操作するので、読み込むときに各行を数えた方が効率的です。


//先に進む前に、これは Batch のコメント マークではなく、エラーの原因になることを指摘しておく必要があります。REM、REMark コマンド、または 2 つのコロンのペアを使用::して、コメントを示します。

setlocal enabledelayedexpansionと行に注意してくださいendlocalSETLOCALすべての変数を一時的に作成し、スクリプトの実行中にのみ存在するようにすることで、スクリプトの最後ですべての変数をクリアする必要がなくなります。enableDelayedExpansion表記法を使用!できるようにし、 so: のように変数にアクセスできるようにします!Variable!。最後endLocalに、スクリプト内の WHERE を指定して、すべての一時変数を無効にするか、元の値に戻しsetlocalます。この行を削除すると、バッチ ファイルの終了時にendLocal暗黙のメッセージが表示されます。endlocal

@Echo Off
setlocal enabledelayedexpansion
Set _InputFile=CONFIG.TXT
set count=

:: Sets each line to a vairable from _data1 to _data##
For /F "tokens=1* delims=:" %%A IN (%_InputFile%) DO (
    set /a count=!count!+1
    Set "_Data!count!=%%A"
)

:: Create a random number between 1 and %count% using the MOD function in 'set /a'
:: Equivalent to: SET /A n = aRandomNumber - ( theSameRandomNumber / %Count% ) + 1
:: See http://en.wikipedia.org/wiki/Mod_function
set /a n=%random% %% %count% +1

:: Echo # of lines, a random # from 1 to %count%, and a random line from the file:
echo.
echo =================================================
echo File is %count% lines deep
echo Random #: %n%

:: Print a random line of data
:: We are taking advantage of Delayed Expansion and ! notation:
Echo Random Line: "!_data%n%!"
echo.

:: Use SET to echo every line of data read in
echo Whole Set of _data[#] data:
set _data
echo.

endlocal

心に留めておくべきことの 1 つはCMD.EXE、古い に固有の制限の一部がもたらされることMS-DOSです。この場合、2 つの重要な制限があります。

1) 使用可能なメモリ量には厳しい制限があります。
2) 環境変数を設定すると、セッションで使用できるメモリが大量に使用されますCMD.EXE

これが意味することは、約 100 個_dataの変数の作成に制限されるため、その時点を超えるデータは変数に保存できないということです。

古いバージョンの Windows では、バッチ ファイル用の.PIFファイルを作成し (コマンド ラインで入力copy nul BatchName.PIFし、Windows エクスプローラーで右クリックして [プロパティ] を選択)、実行時に割り当てられるメモリの量を変更できました。XPでもできると思いますが、Windows 7ではできないことを知っています。既存の .PIF ファイルをダウンロードしてバッチ ファイルに接続することは可能かもしれませんが、私にはわかりません。

于 2012-09-16T21:06:23.627 に答える