與彼得·賴特的想法繼續,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
+1,好主意。假設網絡性能合理,我懷疑如果服務器確實存在性能可能會好。 – dbenham
@ peter-wright:是的,如果我用某個本地位置替換服務器位置(如c:\ Dir1),它實際上運行得很快。但我仍然無法理解爲什麼它很重要。腳本只是聲明一個字符串變量。而且,它並沒有指示尋找那個位置。 – Amit
好,邏輯思維。唯一的問題似乎是它在實際中並不實際工作。這可能會歸結爲字符串如何被實際處理 - 也就是說,可能不是字符串,而是通過將其傳遞給某些OS函數(如INT 21H/60H)。任何人都會猜測操作系統在那裏做什麼。這實際上是一個明智的方法 - 你沒有不同的文件名驗證實現並行維護。在這種情況下,它會降低速度。當然,不是執行批量擴展的人做出的唯一不好的決定。 – Magoo