2009-04-22 15 views
18

Bir dosyanın üst dizinini bir .bat dosyasından almak istiyorum. Yani, "C:\MyDir\MyFile.txt" olarak ayarlanmış bir değişken verildiğinde, "C:\MyDir" almak istiyorum. Başka bir deyişle, tipik bir UNIX ortamında dirname() işlevselliğine eşdeğerdir. Mümkün mü?Bir toplu iş dosyasındaki dirname() eşdeğerini nasıl alabilirim?

+1

Boşluklu dosya adları hakkında bir not ekledim; bunlarla test etmeyi unuttum. – Joey

cevap

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

Bu %filename% saklanan dosya adının sürücü ve dizine %dirname% ayarlayacaktır.

Boşluk içeren dosya isimlerine dikkat edin. Ya onlar çevreleyen tırnak seti lazım:

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

veya for döngüsünde argüman tırnak koymak zorunda: kazandı ikisini aynı anda,

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

Ya yöntemi çalışacak

+0

Sanırım, "for döngüsünde * tırnakları * argümanın etrafına koyabilirsiniz" kastediyorsunuz: " – aphoria

+0

Evet, teşekkürler. Şu anda düzgün düşünemiyorum :) – Joey

+0

@mosh, bir hardlink için beklenen sonuç nedir? Ayrıca, geçici çözümlerin Unicode dosya adlarına ve konsol yazı tipine duyarlı olduğunu unutmayın. – Joey

6

:-) 't ne olursa olsun (hiçbir komut uzantıları vs.) iÇİN kullanamaz sebebi sen paçayı mümkün olabilir ise .. \ kesmek:

set file=c:\dir\file.txt 
set dir=%file%\..\ 
+0

Bu çözüm (cd/d dosya \ ..) win7'de daha iyi çalışır, Diğer çözüm bazen win7 %% ~ dpF'de başarısız olur. – mosh

+0

Yorumumu @ ben-key yanıtına bakın. – Vertigo

3

For döngüsü ile ilgili sorun, dizenin sonunda \ sondan ayrılmasıdır. Dirname'i birden çok kez almak istiyorsanız bu sorunlara neden olur. Belki de sadece ana dizin yerine dosyanın bulunduğu dizinin büyükannesinin olduğu dizinin ismini almanız gerekir. Basitçe for döngü tekniği kullanarak ikinci bir kez \ kaldırmak ve büyükbaba dizini almayacak.

Sadece aşağıdakileri yapamazsınız. Değil, "C: \ 1 \ 2":

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

Bu

birdizin için "\ 1 \ 2 \ 3 c" ayarlayacaktır.

Aşağıdaki işlev, sorunu gidermekle de sorunu çözmektedir \. Aşağıdaki gibi çağrılmaktadır.

set filename=c:\1\2\3\t.txt 
call :dirname "%filename%" _dirname 
call :dirname "%_dirname%" _dirname 
+0

Sondaki sorun için iyi bir çözüm. Aksi takdirde, "% dirname%" yi kullanamazsınız, çünkü son fiyat, önceki eğik çizgiden kaçınılacaktır. Böyle bir durumda ''% dirname% \ ''çalışır. Ama her ikisinden de sadece bir tanesi. – Vertigo

İlgili konular