Reputation: 23
Over the past few years I've really found Stackoverflow to be very helpful, and decided to create an account - this is my first post.
Example situation - I have a fair few of these images, of different subjects -
AAA_BBB_randomDigits_front.jpg
AAA_BBB_randomDigits_left.jpg
AAA_BBB_randomDigits_right.jpg
ZZZ_EEE_randomDigits_front.jpg
ZZZ_EEE_randomDigits_left.jpg
ZZZ_EEE_randomDigits_right.jpg
I would like them to all be grouped up in folders as -
AAA_BBB_randomDigits\(contains left, front and right)
ZZZ_EEE_randomDigits\(contains left, front and right)
The code I currently have works -
@echo off
for /f "tokens=1-3 delims=_" %%a in ('dir /b /a-d *_*_*_*.*') do (
md "%%a_%%b_%%c" 2>nul
move "%%a_%%b_%%c*" "%%a_%%b_%%c"
)
pause
However, I would love it if someone could explain to me -
%%a?
dir /b /a-d
and why do I need it?@echo off
and pause?
Thanks guys, I really appreciate it.
Upvotes: 2
Views: 64
Reputation: 79983
For documentation, see commandname /? from the prompt.
dir /b /a-d filemask
performs a directory listing /b
specifies filenames only - no size, date, header or footer. The /a-d
excludes directorynames.
You need it to provide the names to the for /f
command.
for /f
reads the "filename" in parentheses (it can be a real filename or a single-quoted command (like dir
) or a double-quoted literal string) and assigns values to the metavariable (in this case, %%a
) according to the specified options (the part in quotes directly following the /f
).
The delims
option specifies which set of characters is used for parsing the line of data arriving from the "file" specified. The line is then interpreted as a series of tokens, separated by delimiter-sequences. By default, delims
is Space and Tab. It's common to turn delims
off entirely using "...delims="
in which case, there is but one token (the entire line). Note that any characters between delims=
and "
are equally-ranking and case-sensitive - it is a set
of delimiters which replaces Space and Tab, not a delimiter-string
.
The tokens
option specifies which tokens are selected, by number, starting at 1. The special token *
means "the remainder of the line following the highest-number token specified (including any delimiter characters)". By default, tokens=1
.
%%a
is a metavariable. It is the variable that holds the first token number selected from the tokens=
list. Each selected token number is assigned to the next metavariable name in alphabetical sequence, hence in your example, since you have tokens=1-3
then %%a
is the first token, %%b
the second and %%c
the third. Metavariables are always one letter (some other characters are sometimes used - but numerics are definitely not allowed) and the name is case-sensitive (normally, batch is case-insensitive). %%a
, %%A
and %a%
are all different variables. %a%
and %A%
are the same variable.
A metavariable is only valid within the for
loop where it was created. When the for
loop ends, the variable disappears.
@echo off
simply turns off the command-echoing that batch would otherwise produce (show the command on the console, then execute it). It's used to reduce clutter on the display. When debugging a section of code, it's normal to set echo
to on
(echo on
) and then off again (echo off
) to show precisely what instructions are being executed. The @
means "don't report this command to the console"
The pause
simply waits until a response is received from the keyboard. It's used to allow the display to be read rather than simply continuing directly to the next instruction. It's often used in debugging and also to allow the result of a batch to be held for the user if the batch is executed by using point-click-and-giggle.
Upvotes: 3