Redirection often involves temporary files.
Most of the examples presented on these pages use temporary files without a fully qualified path, which means they will be created in the current directory.
That may be valid for me on my own systems (being a network administrator I have full access rights in every directory), for many users trying to write in the current directory may result in "Access denied" error messages.
One workaround is using the TEMP directory to store those temporary files. Ususally the TEMP directory is specified by the
%TEMP% environment variable.
Since I once did manage a network where
%TEMP% was set to
C:\, I never assume it is
C:\TEMP, and I cannot assume that
%TEMP% will not end with a backslash (
I solve that by using
%TEMP%. (note the dot after the second percent sign) so I know it doesn't end with a backslash.
As long as the directory name specified by
%TEMP% doesn't contain a dot after the last backslash, this will work.
The ending dot will either be ignored if
%TEMP% doesn't end with a backslash, or otherwise the resulting
\.\ will be interpreted as
%TEMP%.\, which is identical to
If the TEMP variable is not set,
%TEMP%.\ will be
.\ which means the current directory.
Windows 2000's TEMP directory name contains spaces by default, which may cause problems in many "old" batch files.
The workaround is to add quotes, but only after the temporary file name has been concatenated:
This will still work in older operating systems.
|Note:||Not all batch file examples on my site have been modified to work in Windows 2000 yet, many may still cause problems with a TEMP directory containing a space in its name.|
Using the TEMP directory doesn't always work for one type of temporary batch file.
As shown in several examples using redirected DATE or TIME commands, some temporary batch files (like CURRENT.BAT) may be called by other temporary batch files, and we have no means to add a TEMP path, since the redirected output (like "Current date is ...") was never intended to be interpreted as a command line.
This can be solved by making
%TEMP% the current directory or by adding the
%TEMP% directory to the PATH variable.
I read some discussions about what if a TEMP directory is read-only?
Well, I consider that an error, since the TEMP directory was meant as a place to store temporary files.
Most of my batch files won't work in that hypothetical situation, and I do not intend to fix that unless someone can convince me that a read-only TEMP directory is a valid option.
|Update:||Ok, someone finally did convince me.
Paul Baumann wrote:
If you use "runas /user:<username> /env <command>" then %temp% is for the original user-and could very well be read-only for the user you are running the command as. The runas command would be used to try to avoid permissions issues, so this doesn't seem too uncommon of a problem.
Absolutely true. This means some extra coding may be required to safely "run as" batch files that require write permissions.