Having used Windows since my earliest memories, I’ve only rarely used the command line. I never found it that useful and was always annoyed by the fact that I couldn’t click somewhere in my command to edit it, and instead had to use the arrow keys to move it forwards and backwards.
However, I’ve recently had to carry out quite a few batch tasks in Windows and have, to my surprise, found the command line to be pretty useful. So, as much to remind myself as anything, I thought I would note down the things that have helped me.
Changing File Extensions
This is easy using the REN command, e.g. REN *.svs *.tif
FOR Loops
As you would expect, this loops over a set of files/directories and carries out a command on each. The basic structure of a FOR command is as follows:
FOR %V IN (set) DO command [command-parameters]
The %V is a variable (it does not have to be ‘v’, but must be a single letter, and it is case sensitive, i.e. %v and %V are different) that can be used in the command parameters to refer to each of the files matched by set. As a spurious example, to echo all of the files in the current working directory, you would give the following command:
FOR %V IN (*) DO echo %V
Variable Modifiers
Variable modifiers can be used to output the variable in a variety of ways, e.g. for %V above:
- %~fV outputs the full path name for the file
- %~nV outputs the file name only
- %~xV outputs the file extension
There are others apart from those mentioned above – see the FOR command help for more.
FOR /D
If the /D extension is used, the FOR command will match directories rather than files.
For example, to separately zip up all of the subdirectories in the current working directory
FOR /D %D IN (*) DO C:\zip\zip.exe -r "%~fD.zip" "%~fD"
Using FOR in batch files
If you are using a FOR command in a batch file, it is necessary to use, for example, %%V, rather than %V for the variables.
START /WAIT
I was using the START command in a batch file to carry out a certain command on multiple files, but I needed it to wait until one command had finished executing before it called the next. Thankfully there is the /WAIT parameter, which means that the next command will not be called until the previous one has finished.