For example, I have the following path: "C:\Windows\Example\001 Example\005 Example" I must extract the "005 Example" from this string. I've tried it with "set path=%path:~0,11%", but the path can also be "C:\Windows\Example\001 Example\005 Example_2"

What I need is to cut the string after the last "\"

How can I do this?

  • Your question is a bit confusing.  How does %path:~0,11% help you get 005 Example?  It looks like it is designed to get "C:\Windows. – Scott Nov 21 '16 at 8:01

First of all, don’t use path as a variable name.  Windows Command Prompt (unlike most components of Unix, including the shells) treats variable names in a case-insensitive way, so path is the same as PATH, which is your execution search path, and if you assign something random to that, you’ll be in a world of hurt.

Use the %variable:str1=str2% form.  (I presume that you know that set /? documents these forms.)  This one is substitution:

C:\> set play=food

C:\> echo %play:foo=bar%

C:\> set animal=cat

C:\> echo %animal:at=ow%

This supports a very limited pattern-matching capability; %variable:*str1=str2% will find and delete everything up to and including the first occurrence of str1 and replace it with str2.  In particular, %variable:*\=% will replace everything up to and including the first \ with null.  E.g., if %pathname% is C:\Windows\Example\001 Example\005 Example, then %pathname:*\=% will evaluate to Windows\Example\001 Example\005 Example (without the C:\). If your pathname will always have four levels, you can do

for %%I in (%pathname%) do set tempname=%%~I
set tempname=%tempname:*\=%
set tempname=%tempname:*\=%
set tempname=%tempname:*\=%
set tempname=%tempname:*\=%
set basename=%tempname%
echo %basename%

The for statement is a bit of a kludge.  It’s a loop that is guaranteed to execute exactly once with index variable %%I set to the value of %pathname%1.  Then it assigns %%~I to tempname.  %%~I is the value of %%I (i.e., the value of %pathname%) except, if that string begins and ends with quote (") characters, they are removed.  If you’re sure that %pathname% doesn’t begin and end with quotes (e.g., because you’ve already done this, or something equivalent), you can skip this step and just start by saying set tempname=%pathname%.

If the pathname has an indeterminate number of levels, do

for %%I in (%pathname%) do set tempname1=%%~I
set tempname2=%tempname1:*\=%
if not %tempname1% == %tempname2% ( set tempname1=%tempname2% & goto loop )
set basename=%tempname1%
echo %basename%

which loops until there are no \s left.
1 Actually, its behavior may be more complex if %pathname% is null (empty), or if it contains wildcard (pattern-matching) characters like ? and *. There may be other peculiar cases that I haven’t found.  (Please let me know if there’s a cleaner way to deal with quotes.)

Warning: I’ve observed %variable:str1=str2% to behave oddly if %variable% is null.

  • 1
    Thanks verry Much. set tempname=%tempname:*\=% was what i searched for. – NvyxMarx Nov 21 '16 at 7:48

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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