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.

link|improve this question

77% accept rate
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
1  
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
1  
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.) – grawity Jul 7 '10 at 12:05
feedback

6 Answers

up vote 5 down vote accepted

Shortest way I've found:

for %* in (.) do @echo %~n*

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

link|improve this answer
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
2  
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
1  
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
Note that if you output this to a file you have to be careful not to add an extra space. Example: for %* in (.) do @echo %~n*> TmpFile – Will Bickford Oct 6 '11 at 22:17
1  
Yes, works if you replace '%' with '%%'. Nice answer. Would have been the accepted answer if that was noted earlier. – djangofan Mar 15 at 20:52
feedback

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
%~dpnx - 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.

link|improve this answer
1  
wow, interestingly enough your right. the command "echo %~dp0" solves my problem also and its more elegant. – djangofan Aug 10 '10 at 21:32
3  
Ok then -- care to award me a '+1' then? – pipitas Aug 11 '10 at 11:09
feedback

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
link|improve this answer
Yep, that actually works. Nicely done. :-) – djangofan Dec 30 '11 at 17:39
feedback

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
link|improve this answer
feedback

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=%%"
link|improve this answer
+1 for demonstrating a neat trick. – djangofan Apr 27 at 4:35
feedback

Probably too late, but still, reading this topic found a way to get a current dir into a variable. One-liner - set a=%cd%

check with echo %a%

link|improve this answer
He wants the current directory name, not the whole path, and as a==cd, you may as well use %cd%. – paradroid Apr 24 at 16:06
feedback

Your Answer

 
or
required, but never shown

Not the answer you're looking for? Browse other questions tagged or ask your own question.