# Get current folder name by a DOS command?

Is it possible to get the current folder name (not current directory path) by using a DOS command? If so, how?

The closest I got was this but it doesn't do it:

for /f "delims=\" %%a in ("%CD%") do set CURR=%%a
echo.DIR: %CURR%


note: the above attempt was me attempting to tokenize the string and get the last token set as the CURR variable.

• If you have any sort of GNU toolset installed, you should be able to go cd | sed "s/.*\\//" (That pipes the output of cd (cwd) into a regular expression search and replace, replacing everything before the final \ with nothing at all) – Phoshi Jul 6 '10 at 22:16
• i need to avoid GNU tools so that the batch file will work anywhere for anyone. My question is for "pure DOS" anyways. – djangofan Jul 6 '10 at 23:17
• Alright. A quick google showed a SO result for implementing regex search and replace in VBScript (stackoverflow.com/questions/127318/…) which could use the same syntax and create the same result - I believe VBScript has been built in since windows 98, so should be quite anywhere for everyone! (You could also very easily rejigger it to work on *nix OS', too) – Phoshi Jul 7 '10 at 9:18
• FYI, neither for /f nor TomWij's %~n* are supported in MS-DOS. (Windows' cmd.exe is not DOS, it's a native Windows program.) – user1686 Jul 7 '10 at 12:05

## 10 Answers

Shortest way I have found:

for %I in (.) do echo %~nxI


or within a .bat script:

for %%I in (.) do echo %%~nxI


or in .bat with Get value in variable.

for %%I in (.) do set CurrDirName=%%~nxI
echo %CurrDirName%


Explanation: http://www.robvanderwoude.com/ntfor.php

nx means file name and extension only

• I like the link and the suggestion but when i put that in a batch file I get an immediate closing of the shell with no output. there must be a syntax error in there somewhere? – djangofan Jul 6 '10 at 23:17
• The example will work on the command line interactively. To use it in a batch file you need to replace all occurrences of % with %%. – Mike Fitzpatrick Jul 7 '10 at 0:56
• Also, the example does not correctly handle folder names containing a period (.), such as my %USERPROFILE% folder. – Mike Fitzpatrick Jul 7 '10 at 1:00
• Yes, works if you replace '%' with '%%'. Nice answer. Would have been the accepted answer if that was noted earlier. – djangofan Mar 15 '12 at 20:52
• Whatever this god-awful evil sorcery is, I'm glad it works. I'm familiar with most of the expansion-syntax, but I've never seen * used with it before o.o – kayleeFrye_onDeck Apr 20 '18 at 4:51

If you want to know the current location of the batch file (and if your Windows isn't a very ancient release), type for /? in a 'DOS box' window. Scroll down. Read.

You'll find out, that you can now read (from within the batch file) these variables:

%0      - as the name how this batchfile was called
%~d0    - as the drive letter where this batchfile is located ('\\' in case of share)
%~p0    - as path (without the drive letter) where this batchfile is located
%~n0    - as filename (without suffix) of this batchfile
%~x0    - as filename's suffix (without filename) of this batchfile
%~a0    - as this batchfile's file attributes
%~t0    - as this batchfile's date+time
%~z0    - as this batchfile's filesize
%~dpnx0 - as this batchfile's fully qualified path+filename
[... and then some more ...]


This works for many cases. Assume, the batchfile is called mytest.bat. You may call it in different ways:

1. ..\..\to\mytest.bat ............................... (relative path)
2. d:\path\to\mytest.bat ........................... (full path)
3. \\fileserver\sharename\mytest.bat ... (path on remote share)

...and you'll always get the right value in your variables.

• wow, interestingly enough your right. the command "echo %~dp0" solves my problem also and its more elegant. – djangofan Aug 10 '10 at 21:32
• Ok then -- care to award me a '+1' then? – Kurt Pfeifle Aug 11 '10 at 11:09
• No, for the reason that 'for /?' was the obvious first place I looked and so this answer is no better than what is expected by anyone. – djangofan Jun 26 '12 at 0:28
• @djangofan: So you say 'Wow, interestingly enough you are right...' to something you did know already?! To an answer that didn't contribute to your knowledge? (You know, '+1' is clicking on the ^-arrow -- it's different from making an answer the accepted one....) – Kurt Pfeifle Jun 26 '12 at 11:50
• it seems that the last one should be %~dpnx0, isn't? – luc Nov 4 '16 at 8:49

I personally liked Toms answer, until it struggled with dots in dir names. This gave me a hint:

for /f "delims=\" %%a in ("%cd%") do echo topmost dir: %%~nxa


Tom's answer is good, but if you have a directory name with a period in it (i.e. wxwidgets-2.9.4) you'll only get the full name. So this would output wxwidgets-2.9 instead because the .4 has been treated as an extension (Yes, even though it's a directory name!).

To get the full output name you have to add on the extension to the end:

FOR %I IN (.) DO Echo %~nI%~xI


and in batch file mode:

FOR %%I IN (.) DO Echo %%~nI%%~xI


Or of course, set a variable in the batch file instead:

FOR %%I IN (.) DO SET CurrentD=%%~nI%%~xI


An other way is:

set "MyPath=%~dpnx0" & call set "MyPath=%%MyPath:\%~nx0=%%"
echo MyPath=%MyPath%


it works with "." and spaces in pathname

What does it do?

1. put the whole filename (driveletter-path-filename-extension) into MyPath Var

2. remove filename and extension from MyPath var

It also works with UNC Paths. If you need the Backslash on the end of the Path. Remove the \ after MyPath in the second set command, eg.

set "MyPath=%%MyPath:%~nx0=%%"

• So how is this different from %~dp0 – Amit Naidu Jun 16 '13 at 11:12

You can get the current dir into a variable. One-liner:

set a=%cd%


Check with

echo %a%

• He wants the current directory name, not the whole path, and as a==cd, you may as well use %cd%. – paradroid Apr 24 '12 at 16:06

just simple

for %%d in ("%CD%") do echo %%~nxd


or

set "sPath=."
for %%d in ("%sPath%") do set "sDirName=%%~nxd"


Be careful of the backslash of the end of path, it has not to be backslash of the end.

My answer in this thread does it in 3 simple lines:

@echo off
SET "CDIR=%~dp0"
:: for loop requires removing trailing backslash from %~dp0 output
SET "CDIR=%CDIR:~0,-1%"
FOR %%i IN ("%CDIR%") DO SET "PARENTFOLDERNAME=%%~nxi"
ECHO Parent folder: %PARENTFOLDERNAME%
ECHO Full path: %~dp0
pause>nul


This works for me from a batch file. It returns the current working directory name.

pushd %1 & for %%i in (.) do @echo %%~ni


Almost all of the above code options will lead to an error if you call the bat file from the outside by other script or program. For example, this code: for %%I in (.) do set CurrDirName=%%~nxI, when called from Notepad++, will output Notepad++, but I don't need a parent Notepad++ folder name surely! It is a bad way. In addition, for the same reason, do not use %cd% and any other options. Use only the input parameters of this, maybe remotely located script. Otherwise, you will get the result for the calling, but not called script and what is written in its command line, but not what must be written in the command line of the called code. Use this code for avoid errors:

    set path=%~p0
set path=%path:~0,-1%
For %%A in ("%path%") do (Set CurrDirName=%%~nxA)