Windows'da toplu komut dosyasının yolunu nasıl alabilirim?


329

Bunu biliyorum %0toplu komut, örneğin tam yolunu içerenc:\path\to\my\file\abc.bat

pathEşit olurdumc:\path\to\my\file

Bunu nasıl başarabilirim?




1
BTW: Yarasa göreceli bir komut satırı ile çağrılırsa% 0 tam yolu içermiyor. Yani "% ~ dpf0" bu durum için daha güvenilir olacaktır.
Ocak'ta

Yanıtlar:


562

%~dp0dizin olacak. Tüm yol değiştiricileri hakkında bazı belgeler . Eğlenceli şeyler :-)

Son ters eğik çizgiyi kaldırmak için, :n,malt dize sözdizimini aşağıdaki gibi kullanabilirsiniz :

SET mypath=%~dp0
echo %mypath:~0,-1%

Maalesef sözdizimini %0sözdizimi ile birleştirmenin bir yolu olduğuna inanmıyorum :~n,m.


7
Mükemmel ... Kullanıyorum %~0\..- daha iyi bir yol olması gerektiğini biliyordum! Ayrıca, dizin adında boşluklar vb %~dp0""
Cameron

1
Güzel ! Ancak, %~dp0sonunda `` içerir. Nasıl kaldırılacağına dair bir fikrin var mı?
Misha Moroshko

1
@Misha: Sonunda '\' nasıl kaldırılacağını kastediyorum. Cevabımı ayrıntılarla güncelledim.
Dean Harding

2
Yanıttaki örnek, yolda boşluk olsa bile tırnak işaretleri olmadan sorunsuz çalışır. (örneğin iyi SET msg=hello worldçalışır). Ancak,% mypath% öğesini başka bir yerde kullanırken, her cdikisi için de gerekli olmasa da, tırnak işaretleri içinde kullanmaya dikkat etmek istersiniz .
Martin Pain

2
Bu bağlantı şimdi 404
StingyJack

12

Yolu "\" izlemeden almak için aşağıdaki komut dosyasını kullanabilirsiniz

for %%i in ("%~dp0.") do SET "mypath=%%~fi"

Bu, dosya adını yoldan kaldırmaz (örn. OP örneğinde abc.txt).
dcp

4
@dcp Er, öyle.
Kyle Strand

@Kyle Strand - Evet, tekrar denedim ve şimdi iyi çalışıyor. Başlangıçta denediğimde ne olduğundan emin değilim, belki senaryoda bir yerde hata yaptım. Karışıklık için özür dilerim ve işaret ettiğiniz için teşekkürler.
dcp

11

%~dp0göreli bir yol olabilir. Tam yola dönüştürmek için şöyle bir şey deneyin:

pushd %~dp0
set script_dir=%CD%
popd

6
Tamam, neden sadece %~dp0doğrudan kullanmıyorsunuz ?
jpaugh

5
5 yıl sonra kabul edilen cevap daha kötü bir sürümü? Anlamıyorum.
Kyle Strand

Bunun kabul edilen yanıtın yorumlarında bahsedilen sorunu çözmek için gönderildiğini %~dp0düşünüyorum - göreceli olabilir, kullanım durumuna bağlı olarak bir sorun olabilir veya olmayabilir
Michael Mrozek

10
%~dp0göreli bir yol içeremez, dsürücü ve pyol anlamına gelir , bir sürücü nasıl göreceli olabilir?
jeb

5
Hangi dünyada? Bu yanıtı Windows Server 2012 r2'de test ettim %~dp0ve komut dosyası göreceli bir yol olarak çalıştırıldığında bile mutlak bir yol olacak. Jeb'in yorumu sayesinde, bu cevaptan aldatılmadım. Neden insanlar bir şeyler uyduruyor ve gidip vahşi hayal güçlerini başkalarına yaymaya başlıyorlar. Bunu yapan bir meslektaşım var, ama onun (genç) yaşını suçladım. Keşke oylamam önemlidir.
bitoolean

0

Kullanabilirsiniz %~dp0, d yalnızca sürücü anlamına gelir, p sadece yol anlamına gelir, 0 toplu iş dosyasının tam dosya adı için bağımsız değişkendir.

Örneğin, dosya yolu C: \ Users \ Oliver \ Desktop \ example.bat ise bağımsız değişken C: \ Users \ Oliver \ Desktop \ değerine eşitse, komutu set cpath=%~dp0 && set cpath=%cpath:~0,-1%kullanabilir %cpath%ve sondaki eğik çizgiyi kaldırmak için değişkeni kullanabilirsiniz .


1
9 yaşındaki yanıttan daha fazla bilgi göremiyorum
'19

Ek bilgi "d yalnızca sürücü anlamına gelir ..." vb. Teşekkürler, @Hayz.
RJ Dunnill

-2

%cd% size komut dosyasının çalıştığı dizinin yolunu verecektir.

Sadece koş:

echo %cd%

%CD%toplu iş dosyasının depolandığı klasör değil, geçerli çalışma klasörüdür. Aynı yer olabilirler, ancak genellikle değildirler.
Stephan

-7

%CD%Değişken bu olurdu .

@echo off
echo %CD%

%CD% toplu iş komut dosyasının içinde bulunduğu geçerli dizini döndürür.


35
% cd%, komut dosyasının çalıştığı dizini değil, komut dosyasının çalıştığı dizini döndürür.
Misha Moroshko

4
yalnızca komut dosyanız çalışma dizinini değiştirmezse çalışır. Dene CD C:\Temp <CR> ECHO %CD%( <CR>is newline ...)
Dean Harding

6
Ayrıca, komut dosyasına sağ tıklayıp "Yönetici Olarak Çalıştır" seçeneğini belirlerseniz, komut dosyasının bulunduğu yerden bağımsız olarak başlangıç ​​dizini C: \ Windows \ System32 dizinidir.
Cameron

OP'nin sorusuna doğrudan bir cevap olmasa da, işlevselliğin bu tadı bu soruyu bulduğumda aradığım şeydi. Teşekkürler!
Zoltán

Gönderilen diğer çözümlerin hiçbiri Win7 32bit cmd.exe'de benim için çalışmıyor gibi görünüyor, bu en azından benim için yararlı.
Clifford

-8

Bir Windows 7 makinesinde çalışıyorum ve bash betiğimin mutlak klasör yolunu almak için aşağıdaki satırları kullandım.

Baktıktan sonra bu çözüme ulaştım Http://www.linuxjournal.com/content/bash-parameter-expansion 'a ulaştım .

#Get the full aboslute filename.
filename=$0
#Remove everything after \. An extra \ seems to be necessary to escape something...
folder="${filename%\\*}"
#Echo...
echo $filename
echo $folder

2
OP, Windows BAT / CMD kabuk komut dosyalarını soruyor, bash değil.
rivy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.