2017-04-10 191 views
0

我很新的命令腳本,請在下面的問題幫助。如何從批處理腳本中的文件路徑獲取目錄路徑

我有下面的for循環,它返回C:\test文件夾及其子文件夾中可用文件的路徑。我想要文件路徑中的目錄路徑例如。

如果for循環返回C:\test\scripts\sample.txt但我只想要C:\test\scripts。對於這個我寫下面的命令

For /R C:\seq\ %%a IN (*) do (
set filename="%%a" 
echo %filename% 
) 

這是不分配文件路徑到變量文件名,所以我可以得到它的目錄路徑。請在批處理腳本中幫助從文件路徑獲取目錄路徑。

+3

看看'for /?'特別是'〜' - 修飾符 – LotPings

回答

0

你只需要使用dp修改:

set filename=%%~dpa 

此外,爲echo變量,你需要與延遲擴展,擴展它:

setlocal enabledelayedexpansion 
For /R C:\seq\ %%a IN (*) do (
set filename="%%a" 
echo !filename! 
) 
0
For /R C:\seq\ %%a IN (*) do (
set filename="%%~dpa" 
call echo %%filename:~0,-1%% 
) 

請參閱許多SO文章約delayed expansion其他方式顯示filename

~dp指定%%a的驅動器和路徑。

看到for /?|more從提示信息

:~0,-1echo選擇所有文字欄最後一個

看到set /?從提示文檔

0

要獲得路徑文件或目錄的父目錄,請使用for變量引用的~dp modifier。如果後\會干擾,你可以使用另一個for循環,如下圖所示:

for /R "C:\test\scripts" %%I IN ("*.txt") do (
    echo Path to parent with trailing `\`: "%%~dpI" 
    echo Path to parent with trailing `\.`: "%%~dpI." 
    for /D %%J in ("%%~dpI.") do (
     echo Pure path to parent: "%%~fJ" 
    ) 
) 

讓我推薦給刪除由sub-string expansion尾部的反斜槓(你需要delayed expansion內循環時在做的,正如其他人所說的那樣),因爲可能會出現導致路徑不再指向原始位置的情況。例如,路徑D:\指向驅動器D:根目錄目錄;刪除\後,路徑爲D:,該路徑指向驅動器目錄當前。使用上述技術避免了這樣的問題。

相關問題