批处理文件功能需要太多时间来执行

时间:2013-07-01 06:10:46

标签: windows batch-file cmd

我编写了一个从完整路径字符串中获取文件名的函数。 但我写的子程序需要花费太多时间(大约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 个答案:

答案 0 :(得分:3)

我认为正在寻找一个名为\\server\Dir1\Dir Number 2\Dir3\Dir4\abc.txt

的人

当然,寻找那台服务器很贵。

如果您删除了\\server它的合理浮油。

答案 1 :(得分: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

答案 2 :(得分:1)

继续Peter Wright的想法,CMD正在浪费时间寻找不存在的远程\\server

您可以通过在路径前加上另一个文件夹来阻止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

答案 3 :(得分: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