Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Скрипт для случайного выбора строки из файла (http://forum.oszone.net/showthread.php?t=165488)

Anonymоus 29-01-2010 05:15 1333075

Скрипт для случайного выбора строки из файла
 
Здравствуйте. Решил написать сюда, вдруг кто поможет, самому не получается решить эту проблему.
Суть такова: нужен скрипт, который из заранее созданного txt-файла извлечет значение каждой строки в переменную, причем переменные должны быть числовыми, и нарастать с шагом 1. То есть, у нас есть файл с содержанием
Код:

crossfire.bsp
lambda_core.bsp
the_beach.bsp

и нужно, чтобы переменная "1" содержала первую строку, "crossfire.bsp", а переменная "3" третью строку "the_beach.bsp".
Дальше нужно осуществить рандомную выборку строки по имени переменной, для этого я нашел кусок кода
Код:

call :RND 1 10 n

:RND
set MIN=%1
set MAX=%2
SET /A %3=%MIN%+(%MAX%-%MIN%+1)*%random%/32768

Теперь нужно решить, как определить суммарное количество строк и подставить его в качестве второго параметра при обращении к генератору случайных чисел.
Для чего всё это нужно - при запуске игрового сервера получить список всех установленных карт и случайно выбрать одну из них.
Если кто подскажет, как все это выполнить в bat-сценарии, буду очень благодарен.

amel27 29-01-2010 06:34 1333098

Anonymоus, где-то так:
Код:

@Echo Off

For /F "Tokens=1,2 Delims=[]" %%i In ('Find /V /N "" "file.txt"') Do Set $_%%i=%%j
For /F "Tokens=*" %%i In ('^<"file.txt" Find /V /C ""') Do Set NUM=%%i

:LOOP
  Set /A RND=1+%RANDOM%/(32768/%NUM%)
  If %RND% GTR %NUM% Set /A RND-=1

  Call Echo %%$_%RND%%%
  PAUSE >Nul
GoTo :LOOP


Anonymоus 29-01-2010 07:00 1333104

Спасибо, что откликнулся - но скрипт работает не совсем так, как нужно. Каждый раз выбирается одна и та же строка.
UPD: Попробовал запустить отдельно генератор рандомных чисел - каждый раз выдает одно и то же, значит проблема в нем.

amel27 29-01-2010 07:15 1333109

Цитата:

Цитата Anonymоus
Попробовал запустить отдельно генератор рандомных чисел - каждый раз выдает одно и то же »

это генератор псевдослучайной последовательности чисел - для каждого батника эта последовательность "проигрывается" заново, в пределах одного батника числа отличаются

Anonymоus 29-01-2010 07:21 1333112

Цитата:

Цитата amel27
псевдослучайной последовательности »

Ясно, а можно что-нибудь придумать, чтобы при каждом запуске батника каждый раз генерировались разные числа? Т.е. мне нужно при запуске батника выбрать случайную строку из файла, может быть существуют консольные утилиты, позволяющие генерировать случайное число в заданном диапазоне?

amel27 29-01-2010 07:25 1333114

Цитата:

Цитата Anonymоus
что-нибудь придумать, чтобы при каждом запуске батника каждый раз генерировались разные числа? »

1. Подождать несколько секунд - стартовое число генерится на базе текущего времени;
2. Запускать батники из одной CMD-сессии/другого батника, а не создавать каждый раз новую.

Anonymоus 29-01-2010 07:39 1333118

Спасибо, разобрался, организовал цикл - N запусков генератора чисел внутри скрипта, где N основано на миллисекундах в текущем времени на момент запуска. Теперь все работает.

neogara 13-06-2010 04:31 1433110

For /F "Tokens=1,2 Delims=[]" %%i In ('Find /N "7777" "temp.txt"') Do Set $_%%i=%%j

А как можно в дальнейшем применить переменную $_%%i чтоб работать с каждой строкой, а то если просто посмотреть результат переменной

Цитата:

echo %$_%%i%
выходит

Цитата:

%$_%%i%
мне нужно работать с той строкой к которой пришла переменная $_3=

а потом со строкой $_5=

amel27 14-06-2010 04:03 1433655

Цитата:

Цитата neogara
echo %$_%%i% »

Код:

set $_
Цитата:

Цитата neogara
мне нужно работать с той строкой к которой пришла переменная $_3= »

Код:

for /f "tokens=1* delims==" %%i in ('set $_') do (
echo var:%%i
echo val:%%j
)



Время: 13:47.

Время: 13:47.
© OSzone.net 2001-