我有一個在Windows中運行的批處理腳本。每次調用批處理腳本時,都會提供一個輸入路徑作爲參數。我需要從路徑中提取文件夾名稱。爲此,我需要從路徑中獲取最後一個「/」索引,然後從該路徑取一個子串直到字符串結束。批處理文件中輸入字符串中字符的最後一個索引
假設我有一個字符串的/ home /和home1/HOME2/home3
我需要的輸出是home3。有沒有什麼辦法來提取相同的。
我有一個在Windows中運行的批處理腳本。每次調用批處理腳本時,都會提供一個輸入路徑作爲參數。我需要從路徑中提取文件夾名稱。爲此,我需要從路徑中獲取最後一個「/」索引,然後從該路徑取一個子串直到字符串結束。批處理文件中輸入字符串中字符的最後一個索引
假設我有一個字符串的/ home /和home1/HOME2/home3
我需要的輸出是home3。有沒有什麼辦法來提取相同的。
對於純DOS/Windows批處理文件,這應該工作:
set FILE="c:\foo\bar.txt"
for /F %%i in ("%FILE%") do @echo %%~ni
這來自DOS BAT file equivalent to Unix basename command?
的Windows PowerShell與Unix外殼提供其他替代品。
所以你有一個字符串表示一個文件夾路徑,並且你想要路徑中最右邊文件夾的名字。 CMD.EXE提供了便捷的工具來處理文件/文件夾路徑,因此不需要搜索最後的\
。
您不會說明字符串所在的位置。它最有可能是1)在批處理參數中,從CALL到批處理腳本或:function,或2)在環境變量中。我將假定一個參數,並顯示一系列解決方案,每個解決方案比前一個更好(更強大)。最後我會略微轉變以適應環境變量的工作。
因此,如果參數%1
包含/home/home1/home2/home3
,那麼您所需要的只是%~n1
。
但文件夾名稱可以包含點,並且最後一個點之後的文本被認爲是擴展名。因此,您還需要修改器x
以包含擴展名。例如,如果%1
包含/home.1/home.2/home.3
,則%~nx
將產生home.3
。如果沒有擴展,它也可以工作。
但文件夾名稱可能包含一個毒藥字符,如&
,所以您應該將該字符串括在引號中:"%~nx1"
。如果您將結果分配給變量,則應將整個分配放在引號中:set "folder=%~nx1"
。該值不包含引號,因此請務必在展開變量時添加引號:"%folder%"
,否則請使用延遲擴展!folder!
。
但有時人包括尾部的反斜槓傳遞文件夾路徑時,如\home1\home2\home3\
。尾隨的反斜槓肯定表示路徑是指文件夾,但%~nx1
不會產生任何結果。使用FOR循環和附加點來解決這個問題有一個簡單的技巧。
for %%F in (%1.) do set "folder=%%~nxF"
請注意,FOR變量使用與參數完全相同的修飾符。附加的點以一種棘手的方式優雅地解決了這個問題。如果存在尾部反斜槓,則該點代表來自該位置的「當前」目錄。擴展修飾符自動將結果標準化爲規範形式,從而產生正確的答案。但是,如果沒有尾部反斜槓,它也可以工作。文件和文件夾名稱不允許以點或空格結束,並且展開規範化將剝離尾點。
還有一些其他深奧的情況下處理UNC路徑和長路徑,通過添加~f
修飾符將%1
轉換爲完整的規範路徑解決。
以下是應始終使用批處理參數%1
的最終解決方案。
for %%F in ("%~f1.") do set "folder=%%~nxF"
我把這個詞「永遠」在引號,因爲它是可能的代碼失敗,但它需要最終用戶做一些愚蠢的傳球一樣"c:\This"^&"that\"
。在這種情況下,正確的做法是通過"c:\This&that\"
。
請注意,傳遞的路徑可能是卷的根目錄,如「c:\」。在這種情況下,結果是一個空字符串,這是正確的 - 沒有文件夾名稱。
如何使用環境變量工作,而不是
假設你有變量folderPath
包含路徑字符串。如果您知道該值不包含任何引號,這是不是一個UNC或長的路徑,那麼你可以簡單地使用:
for %%F in ("%folderPath%.") do set "folder=%%~nxF"
但是,如果值已經包含報價,可以以多種方式失敗,或者如果它是一個UNC或長途的話。解決方法是添加一個額外的FOR/F循環,並將其與延遲擴展相結合,以便將值安全地轉換爲FOR變量。然後可以像以前那樣使用~f
修改器。但路徑可以包含!
字符,如果啓用延遲擴展,則FOR可變擴展將剝離任何!
。所以延遲擴張必須戰略性地打開和關閉。
這裏是具有可變
我假設延遲擴展目前爲關閉工作的最終解決方案。
setlocal enableDelayedExpansion
for /f "eol=: delims=" %%A in ("!folderPath!") do (
endlocal
for %%F in ("%%~fA.") do set "folder=%%~nxF"
)
我不知道任何這最後的代碼可能會失敗的場景。
在Windows中,您應該使用反斜槓作爲路徑分隔符,因爲有些命令可能會遇到其他問題... – aschipfl
您想要_ path_中最後一個「/」索引,或者您想要__ path_中最後一個文件夾名稱?問題標題表明重要數據是character_的_index,但是最後一個文件夾_可以在不使用索引的情況下被提取出來!我建議你將問題集中在_real問題_(如「文件夾名稱」)並且不要插入無關的數據(如「字符索引」)。 – Aacini