批量%var:* \%消除所有前一个\而不是第一个

时间:2014-12-23 05:33:14

标签: batch-file var directory subdirectory

set var=C:\Users\user\Desktop\bla\bla.exe
set var=%var:*\%
echo %var%

这会返回Users \ user \ Desktop \ bla \ bla.exe - 有没有办法让它专注于最后一个\而不是第一个,以便它只返回bla.exe?请记住,这将用于多个文件和文件夹,所以我不会总是知道有多少个子文件夹。

2 个答案:

答案 0 :(得分:2)

@ECHO OFF
SETLOCAL
set "var=C:\Users\user\Desktop\blah blah\bla.exe"
FOR %%a IN ("%var%") DO (
 SET "filename=%%~nxa"
 FOR %%b in ("%%~dpa.") DO SET "lastleaf=%%~nxb"
)
ECHO filename is "%filename%"
ECHO lastleaf is "%lastleaf%"
GOTO :EOF

通常,下一个问题是如何获取目录树的最后一个叶子。不需要子程序......

注意引号的定位以最小化分隔符的问题。同样重要的目录名称 - 更改以显示差异。

答案 1 :(得分:1)

以下代码段显示了一种方法。

    @setlocal enableextensions enabledelayedexpansion
    @echo off

:main
    set var=C:\Users\user\Desktop\blah blah\yada yada.exe
    call :basename result "%var%"
    echo %result%

    endlocal
    goto :eof

:basename
    set %1=%~nx2
    goto :eof

它基本上调用函数basename(以UNIX实用程序命名),传递要为其指定基本名称的全名和变量,并且需要确保正确引用它,以免文件名包含空间会给你带来麻烦。

可以在call /?帮助输出中看到完整的变量修饰符集。


或者,您可以在单行basename语句中使用相同的for功能:

for /f "delims=" %%I in ("%var%") do set result=%%~nxI

这使您可以在不使用调用函数的情况下获取基本名称​​。我倾向于自己喜欢这个功能,因为它更具可读性,但你可以通过仅仅包含一个评论来缓解这个问题:

rem Get base name of var into result:
rem eg: var    = C:\Users\user\Desktop\blah blah\yada yada.exe
rem     result = yada yada.exe

for /f "delims=" %%I in ("%var%") do set result=%%~nxI