İ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?
İ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?
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 %~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.
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 .
*.batveya *.sh?
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.
echo %~dp0toplu iş yerinin yolunu döndürür. echo %~f0dosya adına sahip toplu iş yolunu döndürür.
Çok basit:
setlocal
cd /d %~dp0
File.exe
cd /d %~dp0toplu 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\batDOS 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.