Hello people!
I have interest in learning batch and I'm having a struggle understanding the commands FOR and DO. If any of you could explain me in more detail what do they do it would be really appreciated
Batch FOR / DO
Moderator: DosItHelp
Re: Batch FOR / DO
Well DosTips is not an internet tutorial. It's rather a discussion forum. So you should explain what exactly you want to achieve in order to get help for a certain problem. A FOR loop is not the same as a FOR loop. There are different kinds such as FOR /D, FOR /R, /FOR /L, FOR /F. Meanwhile you might want to read the reference ...
http://www.dostips.com/DosCommandIndex.php#FOR
E.g. on SS64 you'll find extended informations for every kind of FOR loop beginning there:
https://ss64.com/nt/for.html
Steffen
http://www.dostips.com/DosCommandIndex.php#FOR
E.g. on SS64 you'll find extended informations for every kind of FOR loop beginning there:
https://ss64.com/nt/for.html
Steffen
Re: Batch FOR / DO
The FOR command is the most complicated batch command because it does so many different things, depending on the syntax that you use.
You asked to describe FOR and DO, but really you need an explanation of three things: FOR ... IN(...) DO ...
What makes the command so complicated is there are so many radically different things that the construct can do, depending on what options you use. The one thing that all forms have in common is they all iterate a collection of things.
The FOR ... section defines (or partially defines) what type of collection you want to iterate, and exactly what rules you want to use
The IN(...) section defines the actual group of things that will be iterated, and can also assist in specifying the type of things to iterate
The DO ... section specifies exactly what you want to do to each thing (what to do with each iteration)
I will attempt to outline all the possibilities but it probably won't make much sense until you see working examples.
1) Iterate a list of strings (often times the string represents a file, but it does not have to)
2) Iterate files based on wild cards. A folder path may exist, without wild cards, and the file name portion must contain at least one wild card (* or ?). The command will iterate all files that match the file mask at the specified path. The default path is the current directory.
3) Iterate folders based on wild cards with the /D option. The command will iterate all folders that match the folder mask at the specified path. The default path is the current directory. The /D option has no impact unless there is at least one wildcard. Using the /D option without a wildcard functions exactly the same as form 1)
4) Do any of the first 3 things in the context of a folder hierarchy using the /R (recurse) option. Note that the IN clause cannot include a path if you use /R. Instead, the root path must follow the /R option. The default root is the current directory.
4-1) Recursively iterate all folders within a folder hierarchy, and for each folder iteration, iterate each of the IN() strings
4-2) Recursively iterate all files that match the IN file mask within the folder hierarchy
4-3) Recursively iterate all folders that match the IN folder mask within the folder hierarchy by using both /D and /R
5) Iterate lines using the /F option. Each line is parsed into 1 or more tokens. The source of the lines is determined by the syntax used in the IN() clause
The /F option has various sub-options that can be specified after /F. The /F options are usually specified as a single quoted string
DELIMS specifies what characters are used to delimit tokens (defaults to <space> and <tab>)
TOKENS specifies which tokens within each line should be parsed and assigned to a token variable (defaults to the first token)
SKIP specifies how many lines to skip at the beginning (defaults to 0)
EOL specifies which character specifies that a line should be skipped. If a line begins with the EOL character, then the line is skipped (defaults to a semicolon)
USEBACKQ specifies an alternate syntax to use in the IN() clause
5-1) Iterate the lines in one or more files. Wildcards cannot be used. The IN clause must not be quoted, or else double quotes are used with the USEBACKQ option
- note this is the only case where USEBACKQ is really needed, when you want to read a file and the file name must be quoted because it contains spaces.
5-2) Iterate and parse all lines within double quoted string literal (or a single quoted string literal if USEBACKQ is used)
5-3) Iterate and parse all lines of output from a command (only lines output to stdout) The command must be enclosed in single quotes (or backticks if USEBACKQ is used)
Dave Benham
You asked to describe FOR and DO, but really you need an explanation of three things: FOR ... IN(...) DO ...
What makes the command so complicated is there are so many radically different things that the construct can do, depending on what options you use. The one thing that all forms have in common is they all iterate a collection of things.
The FOR ... section defines (or partially defines) what type of collection you want to iterate, and exactly what rules you want to use
The IN(...) section defines the actual group of things that will be iterated, and can also assist in specifying the type of things to iterate
The DO ... section specifies exactly what you want to do to each thing (what to do with each iteration)
I will attempt to outline all the possibilities but it probably won't make much sense until you see working examples.
1) Iterate a list of strings (often times the string represents a file, but it does not have to)
Code: Select all
FOR %%A IN (string1 string2 .... stringN) DO ...
2) Iterate files based on wild cards. A folder path may exist, without wild cards, and the file name portion must contain at least one wild card (* or ?). The command will iterate all files that match the file mask at the specified path. The default path is the current directory.
Code: Select all
FOR %%A IN (optionalPath\file*.txt) DO ...
3) Iterate folders based on wild cards with the /D option. The command will iterate all folders that match the folder mask at the specified path. The default path is the current directory. The /D option has no impact unless there is at least one wildcard. Using the /D option without a wildcard functions exactly the same as form 1)
Code: Select all
FOR /D %%A IN (optionalPath\folder*name) DO ...
4) Do any of the first 3 things in the context of a folder hierarchy using the /R (recurse) option. Note that the IN clause cannot include a path if you use /R. Instead, the root path must follow the /R option. The default root is the current directory.
4-1) Recursively iterate all folders within a folder hierarchy, and for each folder iteration, iterate each of the IN() strings
Code: Select all
FOR /R optionalRootPath %%A IN (string1 string2 ... stringN) DO ...
4-2) Recursively iterate all files that match the IN file mask within the folder hierarchy
Code: Select all
FOR /R optionalRootPath %%A IN (file*mask1 file*mask2 .... ) DO ...
4-3) Recursively iterate all folders that match the IN folder mask within the folder hierarchy by using both /D and /R
Code: Select all
FOR /D /R optionalRootPath %%A IN (folder*mask1 folder*mask2 ... ) DO ...
5) Iterate lines using the /F option. Each line is parsed into 1 or more tokens. The source of the lines is determined by the syntax used in the IN() clause
The /F option has various sub-options that can be specified after /F. The /F options are usually specified as a single quoted string
DELIMS specifies what characters are used to delimit tokens (defaults to <space> and <tab>)
TOKENS specifies which tokens within each line should be parsed and assigned to a token variable (defaults to the first token)
SKIP specifies how many lines to skip at the beginning (defaults to 0)
EOL specifies which character specifies that a line should be skipped. If a line begins with the EOL character, then the line is skipped (defaults to a semicolon)
USEBACKQ specifies an alternate syntax to use in the IN() clause
5-1) Iterate the lines in one or more files. Wildcards cannot be used. The IN clause must not be quoted, or else double quotes are used with the USEBACKQ option
Code: Select all
FOR /F "options" %%A IN (file1 file2 ...) DO ...
FOR /F "USEBACKQ otherOptions" %%A in ("file 1" "file 2") DO
5-2) Iterate and parse all lines within double quoted string literal (or a single quoted string literal if USEBACKQ is used)
Code: Select all
FOR /F "options" %%A IN ("string") DO ...
FOR /F "USEBACKQ otherOptions" %%A in ('string') DO ...
5-3) Iterate and parse all lines of output from a command (only lines output to stdout) The command must be enclosed in single quotes (or backticks if USEBACKQ is used)
Code: Select all
FOR /F "options" %%A IN ('command') DO ...
FOR /F "USEBACKQ otherOptions" %%A IN ('someCommand') DO ...
Dave Benham
Re: Batch FOR / DO
Thanks for the quick response! I really appreciate it! I really find it difficult to understand but this answer helped me a bit. Maybe next time when I have a struggle with some batch program I will write again. Once again thank you fot that response. I'm going to save that text you wrote so it could help me. I really didn't think anyone would answer me but as I see the community here is really friendly