2009-04-22 37 views
18

我想從.bat文件中獲取文件的父目錄。所以,給定一個變量設置爲"C:\MyDir\MyFile.txt",我想獲得"C:\MyDir"。換句話說,在典型的UNIX環境中相當於dirname()功能。這可能嗎?如何在批處理文件中獲得dirname()的等效項?

+1

我加了一個關於帶空格的文件名的註釋;忘記與那些測試。 – Joey 2009-04-22 17:40:14

回答

20
for %%F in (%filename%) do set dirname=%%~dpF 

這將設置%dirname%存儲在%filename%文件名的驅動器和目錄。

雖然,小心使用包含空格的文件名。他們要麼必須與周圍的引號設置:

set filename="C:\MyDir\MyFile with space.txt" 

或你必須把周圍參數報價在for循環:

for %%F in ("%filename%") do set dirname=%%~dpF 

這兩種方法都可以工作,無論是在獲得同一時間「T :-)

+0

我想你的意思是,「把*引號*放在for循環中的參數周圍:」 – aphoria 2009-04-22 18:57:37

+0

是的,謝謝。目前無法正確思考:) – Joey 2009-04-22 19:45:52

+0

@mosh,硬鏈接的預期結果是什麼?另請注意,您的解決方法對Unicode文件名和控制檯字體很敏感。 – Joey 2016-07-09 10:37:26

6

如果因任何原因,你不能使用(沒有命令擴展等),你可能能夠與閃避.. \黑客:

set file=c:\dir\file.txt 
set dir=%file%\..\ 
3

for循環的問題在於,它會在字符串的末尾留下尾部\。這會導致問題,如果你想多次獲取dirname。也許你需要獲取包含該文件的目錄的祖父目錄的名稱,而不僅僅是父目錄。第二次使用for循環技術將刪除\,並且不會獲得祖父目錄。

這就是你不能簡單地做到以下幾點。

set filename=c:\1\2\3\t.txt 
for %%F in ("%filename%") do set dirname=%%~dpF 
for %%F in ("%dirname%") do set dirname=%%~dpF 

這將設置dirname爲「c:\ 1 \ 2 \ 3」,而不是「c:\ 1 \ 2」。

以下功能通過刪除尾部\來解決該問題。

:dirname file varName 
    setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION 
    SET _dir=%~dp1 
    SET _dir=%_dir:~0,-1% 
    endlocal & set %2=%_dir% 
GOTO :EOF 

它被調用如下。

set filename=c:\1\2\3\t.txt 
call :dirname "%filename%" _dirname 
call :dirname "%_dirname%" _dirname 
相關問題