set var=C:\Users\user\Desktop\bla\bla.exe
set var=%var:*\%
echo %var%
这会返回Users \ user \ Desktop \ bla \ bla.exe - 有没有办法让它专注于最后一个\而不是第一个,以便它只返回bla.exe?请记住,这将用于多个文件和文件夹,所以我不会总是知道有多少个子文件夹。
答案 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