İlk olarak bu konuyu gördüm ama anlayamadım.
Soru:
D:\path\to\file.bat
Aşağıdaki içeriğe sahip bir toplu iş dosyası var :
echo %cd%
pause
Çıktı:
C:\
Olmalı D:\path\to
Neyi yanlış yapıyorum?
İlk olarak bu konuyu gördüm ama anlayamadım.
Soru:
D:\path\to\file.bat
Aşağıdaki içeriğe sahip bir toplu iş dosyası var :
echo %cd%
pause
Çıktı:
C:\
Olmalı D:\path\to
Neyi yanlış yapıyorum?
Yanıtlar:
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 %~dp0
Sürücü ve Yol toplu iş komut dosyasına (ör. W:\scripts\
) Ve %~f0
tam 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 %0
değişken genişletilir, sonuç tırnak içine almaktadır.
stm.sql
içinde D:\Dir1\Dir2\stm.sql
. mysql.exe -u root -p mysql < %cd%\stm.sql
Bu stm.sql komutlarını yürütmem gerekiyor .
*.bat
veya *.sh
?
D:\Dir1\Dir2\batchfile.bat
ve 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.sql
ve stm.sql içeriği bazı MySQL komutlarıdır.
echo %~dp0
toplu iş yerinin yolunu döndürür. echo %~f0
dosya adına sahip toplu iş yolunu döndürür.
Çok basit:
setlocal
cd /d %~dp0
File.exe
cd /d %~dp0
toplu iş dosyasının ilk satırı olarak kullanılan ve çalıştı
.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\bat
DOS komut penceresinde bu yolu yankılanacaktır.
İş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.
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
.