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