1

我编写了一个从完整路径字符串中获取文件名的函数。但是我编写的子程序执行时间太长(大约 4 秒)。我试图理解为什么。

这是批处理文件

@echo off
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
goto:eof

:giveFileName
SETLOCAL
set fileName=%~nX1
::echo here is fileNmae %fileName%
(ENDLOCAL&set %~2=%fileName%
)
goto:eof
4

4 回答 4

3

我相信正在尝试定位\\server\Dir1\Dir Number 2\Dir3\Dir4\abc.txt

自然,寻找那台服务器是昂贵的。

如果你删除\\server它是相当光滑的。

于 2013-07-01T06:39:52.127 回答
2

你可以试试这个(没有任何保证!):

@echo off
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
goto:eof

:giveFileName
SETLOCAL
set "fileName=%~1"
FOR /f %%a IN ('cmd /c "ECHO %fileName:\=&echo(%"') DO set "fileName=%%a"
(ENDLOCAL&set "%~2=%fileName%"
)
goto:eof
于 2013-07-01T08:16:32.920 回答
1

继续 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
于 2013-07-01T12:04:04.417 回答
1

在这种情况下,这似乎工作得更快。

@echo off
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
pause
goto :eof

:giveFileName
SETLOCAL
set "fileName=%~1"
set "fileName=%filename:~2%"
for /f "delims=" %%a in ("%filename%") do set "filename=%%~nxa"
ENDLOCAL&set "%~2=%fileName%"
goto:eof
于 2013-07-01T12:34:27.620 回答