Server Fault is a question and answer site for system and network administrators. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

How do I store the last part of directory in a variable?

For example I have the following path: A\B\C\D, I want to store D in variable like file_name=D.

share|improve this question
    
You might have more joy with this over on SuperUser (superuser.com) – James Green Mar 13 '11 at 14:38
up vote 3 down vote accepted

Because of your Windows tag, I assume your cmd.exe has extensions built-in. If that is the case, you can use two of FOR's special substitution variable references:

Given a variable %A, containing a path and file:

%~nA will output the file name, %~xA will output the file extension. The following example uses the pipe character | as a delimiter. The pipe is an invalid character for files and paths and should not appear in a path. This will allow for spaces in paths and filenames. See FOR /? for full details.

C:\> SET FSPATH=C:\WINDOWS\Temp\file.txt
C:\> echo %FSPATH%

C:\WINDOWS\Temp\file.txt

C:\> FOR /F "delims=|" %A IN ("%FSPATH%") do echo %~nxA

file.txt

Alternatively, should you not have extensions in your cmd.exe, you can use delims=\, count the directory separators and split your path/file string based on that number.

Edit: Per your comment about the error. Above is an example on the command line. If you want to perform the same within a batch script, you need to double the % on the the variables:

FOR /F "delims=|" %%A IN ("%FSPATH%") do echo %%~nxA

To use the value outside of the FOR loop, you would need to assign the value to another variable. The variable %%A is limited to the scope of FOR.

:: example.bat
SET FSPATH=C:\Windows\bfsvc.exe
FOR /F "delims=|" %%A IN ("%FSPATH%") DO (
    echo Inside loop %%~nxA
    SET SOMEFILE=%%~nxA
)

ECHO Outside loop %SOMEFILE%
share|improve this answer
    
i try it but the following error appear :- SPATH~nxA was unexpected at this time. – Mohammad AL-Rawabdeh Mar 13 '11 at 15:05
    
this does not work for me. the FOR line echos the correct part of the path but after this the %%~nxA does not get expanded and is passed just as the string "%%~nxA". – vlad_tepesch Jul 20 at 12:23
    
@vlad_tepesch My bad, updated answer with correction about variable scoping outside FOR. – jscott Jul 20 at 12:34
    
@jscott thanks - i just got it with the help of the other answer. It is possible to keep this a one liner by omitting the echo and directly do the set. – vlad_tepesch Jul 20 at 12:43

Give this a try:

for %f in (A\B\C\D) do set var=%~nxf
share|improve this answer
    
this error appear :- ~nxf was unexpected at this time. C:\Program Files\GNU\>for ~nxf – Mohammad AL-Rawabdeh Mar 13 '11 at 15:07
    
@MohammadAL-Rawabdeh: You said "from a command line". If you're doing it in a batch file, you'll need to use double percent signs. – Dennis Williamson Mar 13 '11 at 15:29
    
sorry ... i want execute it from batch file :- it will be %~nxf% – Mohammad AL-Rawabdeh Mar 13 '11 at 15:46
    
@MohammadAL-Rawabdeh: No. for %%f in (A\B\C\D) do set var=%%~nxf – Dennis Williamson Mar 13 '11 at 15:48

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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