Note that I am wrong in assuming that I should use %~dp0% to get the path excluding the filename of a batch file from inside it. I am leaving the question as-is as I have seen others with the same faulty premise. See the accepted answer, and its comment, for more information.
As a lot of the more advanced Windows users' know the expression %~dp0% in a batch file will be evaluated to the batch file's directory including the trailing backslash.
If I have a batch file in D:\ containing echo %~dp0%, that line will behave as expected and output D:\.
The problem
If I create a file D:\FILETOCOPY.txt and a batch file D:\problem.bat with following contents:
@ECHO OFF
copy D:\FILETOCOPY.txt %userprofile%\FILECOPIEDA.txt
copy %~dp0%FILETOCOPY.txt %userprofile%\FILECOPIEDB.txt
set Evaluated=%~dp0%FILETOCOPY.txt
copy %Evaluated% %userprofile%\FILECOPIEDC.txt
cmd.exe
I get this output when I run it (by double clicking) on it:
1 file(s) copied.
The system cannot find the path specified.
1 file(s) copied.
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. All rights reserved.
D:\>
And the file %userprofile%\FILECOPIEDB.txt is missing from the destination. It does work, as proven by FILECOPIEDC.txt, if I evaluate the %~dp0% on a separate line. It seems that it messes up the file copy somehow, but it works as expected in the middle of a echoed line.
Exactly what is going on here?
Try %~dp0 not %~dp0%.
Your command translates to (brackets and underscores inserted for clarity)
copy [%~dp0]_[%FILETOCOPY.txt %] userprofile_[%\FILECOPIEDB.txt]
and since the variable %FILETOCOPY.txt % does not exist, it will be replaced by an empty string.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With