继续 Peter Wright 的想法,CMD 正在浪费时间寻找\\server
不存在的 remote 。
您可以通过在路径前加上另一个文件夹来防止 CMD 这样做。但这仅适用于您想要的只是文件名和/或扩展名的情况。如果您想要驱动器和/或路径,添加前缀显然会破坏结果。
此外,如果您将作业与 ENDLOCAL 放在同一行,则不需要括号。但是由于您所做的只是设置文件名然后立即返回值,因此您甚至不需要中间值,因此您根本不需要 SETLOCAL。
@echo off
setlocal
set "fullPath=\\server\Dir1\Dir Number 2\Dir3\Dir4\abc.txt"
echo %fullPath%
call :giveFileName "%fullPath%" finalName
echo After Function call fileName: %finalName% Good Job
exit /b
:giveFileName
call :giveFileName2 "x\%~1" %2
exit /b
:giveFileName2
set "%~2=%~nX1"
exit /b
您可以通过使用 FOR 变量来获取名称和扩展名,从而使代码更加高效。FOR 变量使用与 CALL 参数相同的扩展修饰符。
@echo off
setlocal
set "fullPath=\\server\Dir1\Dir Number 2\Dir3\Dir4\abc.txt"
echo %fullPath%
call :giveFileName "%fullPath%" finalName
echo After Function call fileName: %finalName% Good Job
exit /b
:giveFileName
for %%F in ("x\%~1") do set "%2=%%~nxF"
如果您不介意每次需要时都重复 FOR 逻辑,则可以完全消除 CALL。
@echo off
setlocal
set "fullPath=\\server\Dir1\Dir Number 2\Dir3\Dir4\abc.txt"
echo %fullPath%
for %%F in ("x\%fullPath%") do set "finalName=%%~nxF"
echo After FOR assignment: %finalName% Good Job
exit /b