2016-09-17 19 views
0

我有一個在Windows中運行的批處理腳本。每次調用批處理腳本時,都會提供一個輸入路徑作爲參數。我需要從路徑中提取文件夾名稱。爲此,我需要從路徑中獲取最後一個「/」索引,然後從該路徑取一個子串直到字符串結束。批處理文件中輸入字符串中字符的最後一個索引

假設我有一個字符串的/ home /和home1/HOME2/home3

我需要的輸出是home3。有沒有什麼辦法來提取相同的。

+0

在Windows中,您應該使用反斜槓作爲路徑分隔符,因爲有些命令可能會遇到其他問題... – aschipfl

+0

您想要_ path_中最後一個「/」索引,或者您想要__ path_中最後一個文件夾名稱?問題標題表明重要數據是character_的_index,但是最後一個文件夾_可以在不使用索引的情況下被提取出來!我建議你將問題集中在_real問題_(如「文件夾名稱」)並且不要插入無關的數據(如「字符索引」)。 – Aacini

回答

2

對於純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外殼提供其他替代品。

+0

謝謝託德! :) –

+1

不需要'/ F'選項... – aschipfl

+0

不僅/ F不是必需的,如果路徑中有空格,則會引發問題,除非DELIMS設置爲空。另外,它應該是'%%〜nxi',因爲文件夾名稱可以包含點。 – dbenham

0

所以你有一個字符串表示一個文件夾路徑,並且你想要路徑中最右邊文件夾的名字。 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" 
) 

我不知道任何這最後的代碼可能會失敗的場景。

相關問題