Go Premium for a chance to win a PS4. Enter to Win

x
?
Solved

Help with random text in a batch logon scritp

Posted on 2004-09-17
12
Medium Priority
?
712 Views
Last Modified: 2012-05-05
Im just gonna give 500pts because every time I ask a question it tends to be much harder to do then what I though it would.

BASICLY I want a .bat file

In it I wnat to have say 3 lines of text

Text 1
Text 2
Text 3

The long.bat will call this RANDOM TEXT.bat file.

I want it to AT RANDOM pick 1 line of text and ECHO it and then END that bat file.. I don't want all the Text files listed each log on. just 1 from the list at random.

OK... any body have any thing like this?
0
Comment
Question by:mrchaos101
12 Comments
 
LVL 1

Author Comment

by:mrchaos101
ID: 12088449
Possable VB SCRIPT Item? or can ti be done in batch?
0
 
LVL 22

Expert Comment

by:cookre
ID: 12088887
Will the number of text lines vary?
If so, is there a maximum number of lines it will have?
0
 
LVL 22

Expert Comment

by:cookre
ID: 12088895
Oops, and/or minimum number of lines?
0
What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

 
LVL 1

Author Comment

by:mrchaos101
ID: 12088960
well no it will be a static number but i think I can change say if I want to add 1 more line of text so there wre 4 I could probly figure out how to edit the bat to make it  work.
0
 
LVL 86

Expert Comment

by:Mike Tomlinson
ID: 12089275
Here is a vb script (.vbs file) that will read a text file and display a random line from it in a msgbox:

Dim i, entireFile, lines
Dim fso, f, fsoStream

Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.GetFile("c:\test.txt")
Set fsoStream = f.OpenAsTextStream(1)
entireFile = fsoStream.ReadAll
fsoStream.Close
Set fsoStream = Nothing
Set fso = Nothing

lines = Split(entireFile, vbCrLf)
Randomize
i = Int((ubound(lines) + 1) * Rnd)
MsgBox lines(i)
0
 
LVL 22

Expert Comment

by:cookre
ID: 12089346
Change "c:\lines.txt" to wherever the file is that has the lines to be selected from.

(uncommented just to maintain the mystique)

@echo off
for /f %%a in ('time /t') do set zD1=%%a
set zD2=%zD1:~4,1%
if not defined zNUM1 set /a zNUM1=%zD2%
set /a zNUM1=zNUM1 * 214013 + 2531011
set /a zNUM2=zNUM1 ^>^> 16 ^& 0x7fff
set zIDX=%zNUM2:~0,1%
set /a zIDX=zIDX/3
set /a zIIDX=0
set zLO=
set zLL=""
for /f %%a in (c:\lines.txt) do call :zoo  %zIDX%  %%a
if {%zLO%}=={} set zLO=%zLL%
goto awdun
:zoo
set zLL=%2
if {%1}=={%zIIDX%} set zLO=%2
::echo =%1=%2=%zIIDX%=
set /a zIIDX=%zIIDX% + 1
goto :eof
:awdun
echo %zLO%
0
 
LVL 2

Expert Comment

by:mishagale
ID: 12090179
Cookre: Coding a random number generator in batch commands? I wouldn't have thought it possible, but kudos for suceeding. The "mystique" is well preserved, by your use of wonderfully incomprehensible variable names, but this does make debugging rather tricky; when I run your batch file, on windows 2000, it only outputs the first word of each line in the file. A kludge to fix this is to change the second for loop from:

for /f %%a in (c:\lines.txt) do call :zoo  %zIDX%  %%a

to:

for /f "tokens=*" %%a in (c:\lines.txt) do call :zoo  %zIDX%  "%%a"

This does have to side effect of enclosing your output in double-quotes, but perhaps cookre can offer a more elegant solution - this kind of batch programming is black magic as far as I'm concerned.
0
 
LVL 22

Expert Comment

by:cookre
ID: 12090380
That's what I get for testing agains single word lines.

Let's see if I can fix it.
0
 
LVL 22

Accepted Solution

by:
cookre earned 2000 total points
ID: 12090510
A wee fix.
Presuming there's no '@' in the text file.
If there is, change the delims="@" below to some char not in the file.
The var names were chosen because:
1) I'm lazy
2) To avoid stepping on extant names.  

@echo off

:: Get time (alas, it's only HH:MM xM
for /f %%a in ('time /t') do set zD1=%%a

:: Get last digit of MM
set zD2=%zD1:~4,1%

:: Seed the randomizer, if needed
if not defined zNUM1 set /a zNUM1=%zD2%

:: Get a kinda random number
set /a zNUM1=zNUM1 * 214013 + 2531011
set /a zNUM2=zNUM1 ^>^> 16 ^& 0x7fff

:: Pull off the first digit
:: (Last digit would be better, but it's late, and I'm tired)
set zIDX=%zNUM2:~0,1%

:: Map it down to 0-3
set /a zIDX=zIDX/3

:: Finally, we can set do some proper initialization
set /a zIIDX=0
set zLO=
set zLL=""

:: Step through each line in the file, looking for line zIDX
for /f "delims=@" %%a in (c:\lines.txt) do call :zoo  %zIDX%  %%a

:: If line zIDX wasn't found, we'll settle for zee LastLine
if "%zLO%"=="" set zLO=%zLL%
goto awdun

:: See if the current line is line zIDX
:zoo

:: Save string of all parms
set zALL=%*

:: Strip off the first parm (sure hope lines aren't longer than 254 chars)
set zWORDS=%zALL:~2,255%

:: Make this line zee LastLine
set zLL=%zWORDS%

:: If this is the line we're looking for, make it zee LineOut
if {%1}=={%zIIDX%} set zLO=%zWORDS%

:: Keep track of line numbers
set /a zIIDX=%zIIDX% + 1
goto :eof

:awdun
echo ==%zLO%==

:: Be socially responsible
set zALL=
set zD1=
set zD2=
set zIDX=
set zIIDX=
set zLL=
set zLO=
:: But don't mess with seed
::set zNUM1=
set zNUM2=
set zWORDS=
0
 
LVL 85

Expert Comment

by:oBdA
ID: 12091731
Assuming W2k or later, this should do it (number of lines is flexible):

@echo off
setlocal
set TextFile=D:\Temp\test.txt
:: *** Get the number of lines in the file:
for /f "delims=" %%a in ('find /v /c "" "%Textfile%"') do for %%i in (%%a) do set NumLines=%%i
:: *** Create a random number in the range of the text file:
set /a RandomLine = (%Random% %% NumLines) + 1
:: *** And print the line:
for /f "tokens=1* delims=[]" %%a in ('find /v /n "" "%TextFile%"') do if %%a EQU %RandomLine% echo %%b

Some remarks:
setlocal makes sure the used variables are only existing during the run of the batch.
%Random% only exists in W2k and later.
The "number of lines" construction may seem a bit odd, but find's count output can't easily be handled with for /f, since the number of lines is always the last token, but there's no usable delimiter in the output, as there may be spaces as well as an addiitonal colon in the file name.
0
 
LVL 5

Expert Comment

by:ITcrow
ID: 12094441

# find a random number:
Eg. assumes you have five lines:
set /a x=(%random%%5)+1

# number your file, if you don't already have it that way:
type YourMessageFile.txt | find /v /n "&$&$&$123" > YourNewMessageFile.txt

# Find the message according to random number given in Step 1
type YourNewMessageFile.txt | find "[%x%]"
0
 
LVL 3

Expert Comment

by:Statick001
ID: 12101555
wow this is a fascinating thread!
surprised anyone can still code like that in batch commands :)
0

Featured Post

VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Make the most of your online learning experience.
Tech spooks aren't just for those who are tech savvy, it also happens to those of us running a business. Check out the top tech spooks for business owners.
Michael from AdRem Software outlines event notifications and Automatic Corrective Actions in network monitoring. Automatic Corrective Actions are scripts, which can automatically run upon discovery of a certain undesirable condition in your network.…
Monitoring a network: how to monitor network services and why? Michael Kulchisky, MCSE, MCSA, MCP, VTSP, VSP, CCSP outlines the philosophy behind service monitoring and why a handshake validation is critical in network monitoring. Software utilized …

926 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question