批处理 %var:*% 以消除最后一个之前的所有 而不是第一个


set var=C:UsersuserDesktopblabla.exe
set var=%var:*%
echo %var%

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

@ECHO OFF
SETLOCAL
set "var=C:UsersuserDesktopblah blahbla.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

通常,下一个问题是关于如何获取目录树的最后一片叶子。无需子例程...

注意引号的位置,以尽量减少分隔符的问题。所以小的目录名称更改以显示差异。

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

    @setlocal enableextensions enabledelayedexpansion
    @echo off
:main
    set var=C:UsersuserDesktopblah blahyada yada.exe
    call :basename result "%var%"
    echo %result%
    endlocal
    goto :eof
:basename
    set %1=%~nx2
    goto :eof

它基本上调用一个函数basename(以UNIX实用程序命名(,传递全名和要为其分配基本名称的变量,并且您需要确保正确引用它,以免包含空格的文件名会给您带来问题。

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


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

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

这允许您获取基名称,而无需调用函数。我自己更喜欢这个函数,因为它更具可读性,但您可以通过添加注释来缓解这种情况:

rem Get base name of var into result:
rem eg: var    = C:UsersuserDesktopblah blahyada yada.exe
rem     result = yada yada.exe
for /f "delims=" %%I in ("%var%") do set result=%%~nxI

相关内容

最新更新