for loop - Flow control in a batch file -


reference iterating arrays in batch file

i have following:

for /f "tokens=1" %%q in ('query termserver') (     if not errorlevel (         echo checking %%q         /f "tokens=1" %%u in ('query user %userid% /server:%%q') (echo %%q)     ) ) 

when running query termserver command line, first 2 lines are:

known -------------------------  

...followed list of terminal servers. however, not want include these part of query user command. also, there 4 servers not wish include. when supply userid code, program promptly exiting. know has if statement. not possible nest flow control inside for-loop?

i had tried setting variable names of servers wanted check, iteration end on first server:

set termservers=server1.server2.server3.server7.server8.server10  /f "tokens=2 delims=.=" %%q in ('set termservers') (     echo checking %%q     /f "tokens=1" %%u in ('query user %userid% /server:%%q') (echo %%q) ) 

i prefer second example on first if nothing else cleanliness.

any regarding either of these issues appreciated.

again, there multiple things note here.

if errorlevel

the if says:

if [not] errorlevel number command 

as syntax if errorlevel condition. is, must provide number compare against. keep in mind if errorlevel n evaluates true if exit code at least n.

so

if errorlevel 1 ... 

catches error (that signaled through exit code), while

if errorlevel 0 ... 

simply true.

anyways, want a

if not errorlevel 1 ... 

here, since condition true if no error occurred.

skipping lines

the for /f command has argument skip=n can used skip lines @ start. if output starts 2 lines don't want, can do

for /f "skip=2 tokens=1" %%q in ('query termserver') 

iterating on multiple known values in for /f

the problem second code snippet for iterates line-wise. when give single environment variable tokenize (and put tokens different variables), loop runs once per line. note using set here bit error-prone might more want. like

for /f ... in ("%termservers%") ... 

would have been easier. still, doesn't solve original problem. easiest way solve following:

rem space-separated list of servers set termservers=server1 server2 server3 server7 server8 server10  rem call subroutine list of servers call :query_servers %termservers%  rem exit batch file here, prevent subroutine running again afterwards goto :eof  rem subroutine iterate on list of servers :query_servers    rem process next server in list   rem note usage of %1 here instead of loop variable   echo checking %1             /f "tokens=1" %%u in ('query user %userid% /server:%1') (echo %%q)    rem remove first argument processed   shift    rem if there still server processed,   rem we're mis-using subroutine label jump target here   if not [%1]==[] goto query_servers  rem kind of "return" statement subroutines goto :eof 

(untested, should work.)

eta: gah, , once again miss obvious answer:

set termservers=server1 server2 server3 server7 server8 server10 %%s in (%termservers%) (     /f "tokens=1" %%u in ('query user %userid% /server:%1') (echo %%q) ) 

note for, not for /f , dutifully iterate on list of values. don't know how missed one, sorry.


Comments

Popular posts from this blog

javascript - Enclosure Memory Copies -

php - Replacing tags in braces, even nested tags, with regex -