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
Post a Comment