Ocassionally I need to automate things with Windows cmd or bat files. I can never seem to remember the cryptic Windows shorthand to get the working directory name and end up digging through old scripts to find it.
%~dp0
is the Windows equivalent of `pwd`
in bash.
set PWD=%~dp0
echo %PWD%
Searching Google for %~dp0 turned up an interesting Microsoft link about batch parameters.
thanks :) you saved my life!
Another great thank you :) terrible windows cmd shell :)
Thanks !!
Danke
If you have command extensions enabled %CD% also works:
C:\WINDOWS\system32>echo %CD%
C:\WINDOWS\system32
(a little easier to remember!)
%~dp0 is different from %CD%
If you run a batch file from cmd,
• %CD% returns current directory for cmd,
e.g. C:\Documents and Settings\%USERNAME%
• %~dp0 returns current directory for the executable file.
E.g. your run the script from D:\myscripts\bla.bat, then %~dp0 will return D:\myscripts
Thanks for the topic!
Thanks a lot!!
Those Batch-Stuff is really awfull, but your tip made it a bit more *nix. ;)
THIS IS INCORRECT!
As katmon already pointed out, the behaviour of the unix command pwd and the windows command cd are equivalent.
%~dp0 only gives you %0
This can be dangerous if you want to test whether the script is called with the correct working directory.
un merci de France pour l’information :-)
This is wrong. pwd is equivalent to %cd% (or .) If you want the current working directory, use %cd%. If you want the directory of the executable, use %~dp0.
The answer in the post is correct. I think you misunderstood the bash part.
In a bash script `pwd` gives the directory of the executable just like %~dp0 in a cmd script.
Note the backticks around the pwd. The backticks cause bash to execute pwd and replace `pwd` in the script with the standard output from the pwd command, which is the working directory for the script itself.
You are wrong donc. pwd in bash is print working directory. it gives the current directory. The backticks simply making it return the value instead of printing it, but it still gives the current directory. much like %cd% in windows batch files. The %~dp0 gives the directory of the script, not the working directory. The unix equivalent would be `dirname $0`
You can even change directories within a script! %~dp0 doesn’t change. Nor does it reflect that you might have called the script from somewhere else
The following windows batch file
—
@echo off
echo dp0: %~dp0
echo cd: %cd%
cd c:\Windows
echo Changing to C:\Windows
echo dp0: %~dp0
echo cd: %cd%
—
is equivalent to the following bash shell script
—
echo \$0: `dirname $0`
echo pwd: `pwd`
cd /bin/
echo Changing to /bin/
echo \$0: `dirname $0`
echo pwd: `pwd`
—
If I run the first from H: as C:\Temp\foo.cmd I get the following output
—
H:\>c:\Temp\foo
dp0: c:\Temp\
cd: H:\
Changing to C:\Windows
dp0: c:\Temp\
cd: H:\
—
If I run the linux version from my home folder as /smbshare/foo.sh I get the following output
—
[adamc@adamc-centos ~]$ /smbshare/foo.sh
$0: /smbshare
pwd: /home/adamc
Changing to /bin/
$0: /smbshare
pwd: /bin
—
As you can see, %~dp0 is simply *not* equivalent to PWD but to `dirname $0`. %cd% is equivalent to `pwd`