Geçerli batchfile dizinini al


283

İlk olarak bu konuyu gördüm ama anlayamadım.

Soru:

D:\path\to\file.batAşağıdaki içeriğe sahip bir toplu iş dosyası var :

echo %cd%
pause

Çıktı:

C:\

Olmalı D:\path\to

Neyi yanlış yapıyorum?


7
Bir sorunun tüm cevaplarını, özellikle kabul edileni değil, daha yüksek oy alan kişileri okumalısınız. Gönderilen bağlantınızda en yüksek puanı alan cevap zaten sorunuzu cevaplıyor.
dbenham

4
Toplu iş dosya adını yazdığınızda c: \ iseniz,% cd% 'nin yazdırdığı c: \ olur.
foxidrive

Yanıtlar:


496

Sistem salt okunur değişkeni %CD%, toplu iş dosyası konumunu değil, toplu arayanın yolunu tutar.

Toplu komut dosyasının adını, kullanıcı tarafından %0(örn. scripts\mybatch.bat) Yazdığı şekilde alabilirsiniz . Parametre uzantıları buna uygulanabilir, böylece %~dp0Sürücü ve Yol toplu iş komut dosyasına (ör. W:\scripts\) Ve %~f0tam yol adını (ör. W:\scripts\mybatch.cmd) Döndürür .

Bu sözdizimini kullanarak toplu iş komut dosyasıyla aynı klasördeki diğer dosyalara başvurabilirsiniz:

CALL %0\..\SecondBatch.cmd

Bu bir altyordamda bile kullanılabilir Echo %0, çağrı etiketini verir, ancak echo "%~nx0"toplu iş komut dosyasının dosya adını verir.

Ne zaman %0değişken genişletilir, sonuç tırnak içine almaktadır.

Parti parametreleri hakkında daha fazla bilgi .


1
Bak, çalıştırmak gerek yok stm.sqliçinde D:\Dir1\Dir2\stm.sql. mysql.exe -u root -p mysql < %cd%\stm.sqlBu stm.sql komutlarını yürütmem gerekiyor .
Hamed Kamrava

@HamedKamrava benim SQL toplu işim için mi? değil toplu iş dosyası *.batveya *.sh?
Stoleg

@ Stoleg- Aslında, D:\Dir1\Dir2\batchfile.batve içinde 2 dosya var D:\Dir1\Dir2\stm.sql. batchfile.bat içeriği: mysql.exe -u root -p mysql < D:\Dir1\Dir2\stm.sqlve stm.sql içeriği bazı MySQL komutlarıdır.
Hamed Kamrava

1
Sistem salt okunur değişkeni% CD%, toplu iş dosyasının konumunu değil, toplu arayanın yolunu tutar.
Stoleg

34
echo %~dp0toplu iş yerinin yolunu döndürür. echo %~f0dosya adına sahip toplu iş yolunu döndürür.
Stoleg

119

Çok basit:

setlocal
cd /d %~dp0
File.exe

9
Kod kısa ama anlaşılması kolay değil. Bu File.exe nedir? Geçerli dizin yolu% ~ dp0 içinde saklanıyor mu?
Ivailo Bardarov

Bu cevap aslında soruyu cevaplıyor sanırım. Kudos.
macetw

3
Ben sadece cd /d %~dp0toplu iş dosyasının ilk satırı olarak kullanılan ve çalıştı
mkb

neden setlocal'a ihtiyaç var? O olmadan da iyi döner?
T.Todua

1
@ T.Todua "setlocal", toplu iş dosyası bitene veya bir "endlocal" ile karşılaşılana kadar geçerli dizin de dahil olmak üzere tüm ortam değişikliklerinin bulunmasına neden olur. Ortam değişkenlerini veya geçerli dizini değiştirecekseniz, bu iyi bir formdur.
Jamie

30

.Bat dosyanızın içinde:

set mypath=%cd%

Şimdi değişkeni %mypath%, dosya yolunu dosyaya başvurmak için kullanabilirsiniz .bat. Yolun doğru olduğunu doğrulamak için:

@echo %mypath%

Örneğin DIR.bat, aşağıdaki içeriğe sahip bir dosya

set mypath=%cd%
@echo %mypath%
Pause

dizinden çalıştırmak g:\test\batDOS komut penceresinde bu yolu yankılanacaktır.


1
Bu en iyi ve en basit çözüm
Nani

7
Bu iyi bir çözüm değildir, çünkü başka bir yoldaki başka bir dosyadan çağırılan toplu komut dosyasını dikkate almaz.
TheQuestionMan

yükseltilmiş izinler olarak da çalıştırıldığında% cd% C: \ Windows \ system32 değerini döndürür ancak depolandığı dizini döndürmez.
PravyNandas

9

İşte tüm toplu iş dosyalarımın üstünde kullanıyorum. Sadece şablon klasörümden kopyalayıp yapıştırıyorum.

@echo off
:: --HAS ENDING BACKSLASH
set batdir=%~dp0
:: --MISSING ENDING BACKSLASH
:: set batdir=%CD%
pushd "%batdir%"

Geçerli toplu iş dosyasının yolunu% batdir% olarak ayarlamak, bu toplu iş dosyasının nerede değiştiğine bakılmaksızın geçerli toplu iş dosyasında sonraki stmts olarak çağırmanıza olanak tanır. PUSHD kullanmak, bu toplu iş dosyasının orijinal% batdir% yolunu hızlı bir şekilde ayarlamak için POPD kullanmanızı sağlar. % Batdir% ExtraDir veya% batdir% \ ExtraDir kullanıyorsanız (yukarıda kullanılan sürüme bağlı olarak, ters eğik çizgi ile bitip bitmeyeceğine bağlı olarak), yol boşlukları varsa tüm dizeyi çift tırnak içine almanız gerektiğini unutmayın (örn. "% Batdir% ExtraDir" ). Her zaman PUSHD% ~ dp0 kullanabilirsiniz. [https: // ss64.com/ nt / syntax-args .html] daha fazla (% ~) parametreye sahiptir.

Bir satırın başında (: :) kullanmanın onu bir yorum satırı yaptığını unutmayın. Daha da önemlisi, :: kullanılması, bu yoruma yeniden yönlendiriciler, borular, özel karakterler (örn. <> | Vb.) Eklemenizi sağlar.

:: ORIG STMT WAS: dir *.* | find /v "1917" > outfile.txt

Elbette, Powershell bunu ve daha fazlasını yapar.


2
Harika cevap, çok teşekkürler! :-) Sadece ikinci tekniğinize ( set batdir=%CD%) dikkat edin . Bu doğru değil, çünkü arayanın yolu, yarasa dosyasının kendisi değil. Yürütülen yarasa dosyasının yolunu almanın tek geçerli yolu %~dp0.
Mitch McMabers
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.