6

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.

Ben Pilbrow
  • 11,995
  • 5
  • 35
  • 57
Mohammad AL-Rawabdeh
  • 1,592
  • 12
  • 30
  • 54

2 Answers2

8

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%
jscott
  • 24,204
  • 8
  • 77
  • 99
2

Give this a try:

for %f in (A\B\C\D) do set var=%~nxf
Dennis Williamson
  • 60,515
  • 14
  • 113
  • 148