Bagaimana cara mendapatkan lintasan skrip batch di Windows?

329

Saya tahu itu %0berisi path lengkap skrip batch, misc:\path\to\my\file\abc.bat

Saya akan pathsama denganc:\path\to\my\file

Bagaimana saya bisa mencapainya?

Misha Moroshko
sumber
1
BTW:% 0 tidak mengandung path lengkap jika bat dipanggil dengan baris perintah relatif. Jadi "% ~ dpf0" akan lebih dapat diandalkan untuk kasus ini.
eckes

Jawaban:

563

%~dp0akan menjadi direktori. Berikut ini beberapa dokumentasi pada semua pengubah jalur . Hal menyenangkan :-)

Untuk menghapus garis miring terbalik terakhir, Anda dapat menggunakan :n,msintaksis substrat, seperti:

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

Sayangnya, saya tidak percaya ada cara untuk menggabungkan %0sintaksis dengan :~n,msintaksis.

Dean Harding
sumber
7
Luar biasa ... Saya telah menggunakan %~0\..- tahu harus ada cara yang lebih baik! Juga, Anda mungkin ingin menyertakan %~dp0tanda kutip ganda ( "") jika ada spasi dalam nama direktori, dll.
Cameron
1
Bagus! Tapi, %~dp0berisi `` di bagian akhir. Apakah Anda punya ide cara menghapusnya?
Misha Moroshko
1
@Misha: Saya berasumsi maksud Anda cara menghapus '\' di bagian akhir. Saya telah memperbarui jawaban saya dengan detail.
Dean Harding
2
Contoh dalam jawaban berfungsi dengan baik tanpa tanda kutip bahkan ketika ada ruang di jalan. (mis. SET msg=hello worldberfungsi dengan baik). Namun, ketika menggunakan% mypath% di tempat lain Anda ingin berhati-hati menggunakannya dalam tanda kutip, meskipun mereka tidak diperlukan cdjuga.
Martin Pain
2
Tautan itu sekarang 404
StingyJack
12

Anda dapat menggunakan skrip berikut untuk mendapatkan lintasan tanpa mengeklik "\"

for %%i in ("%~dp0.") do SET "mypath=%%~fi"
duan
sumber
Ini tidak menghapus nama file dari path (misalnya abc.txt dalam contoh OP).
dcp
4
@dcp Eh, memang.
Kyle Strand
@Kyle Strand - Ya, saya baru mencobanya lagi dan sekarang berfungsi dengan baik. Saya tidak yakin apa yang terjadi ketika saya mencobanya pada awalnya, mungkin saya membuat kesalahan di suatu tempat dalam naskah. Maaf atas kebingungannya, dan terima kasih telah menunjukkannya.
dcp
11

%~dp0mungkin jalur relatif. Untuk mengonversinya menjadi jalur lengkap, coba sesuatu seperti ini:

pushd %~dp0
set script_dir=%CD%
popd
Arnaud
sumber
6
Ok, jadi kenapa tidak pakai saja %~dp0secara langsung?
jpaugh
5
Versi yang lebih buruk dari jawaban yang diterima, diposting 5 tahun kemudian? Saya tidak mengerti.
Kyle Strand
Saya membayangkan ini diposting untuk mengatasi masalah yang disebutkan dalam komentar jawaban yang diterima - %~dp0dapat bersifat relatif, yang mungkin atau mungkin tidak menjadi masalah tergantung pada kasus penggunaan
Michael Mrozek
10
%~dp0tidak dapat berisi path relatif, dsingkatan drive dan ppath, bagaimana drive bisa relatif?
jeb
5
Di dunia mana? Saya baru saja menguji jawaban ini pada Windows Server 2012 r2 dan ternyata %~dp0akan menjadi path absolut bahkan ketika skrip dijalankan sebagai path relatif. Berkat komentar jeb, saya tidak tertipu oleh jawaban ini. Mengapa orang hanya membuat barang dan pergi dan mulai menyebarkan imajinasi liar mereka kepada orang lain. Saya memiliki rekan ini yang melakukan ini, tetapi saya menyalahkan usianya (muda). Saya berharap down-vote saya akan diperhitungkan.
bitoolean
0

Anda dapat menggunakan %~dp0, d berarti drive saja, p berarti path saja, 0 adalah argumen untuk nama file lengkap dari file batch.

Sebagai contoh jika path file adalah C: \ Users \ Oliver \ Desktop \ example.bat maka argumennya akan sama dengan C: \ Users \ Oliver \ Desktop \, Anda juga dapat menggunakan perintah set cpath=%~dp0 && set cpath=%cpath:~0,-1%dan menggunakan %cpath%variabel untuk menghapus trailing slash.

Hayz
sumber
1
Saya tidak dapat melihat informasi lebih lanjut, dari pada jawaban berusia 9 tahun
jeb
Informasi tambahan adalah "d berarti hanya drive, ..." dll. Terima kasih, @Hayz.
RJ Dunnill
-2

%cd% akan memberi Anda jalur direktori tempat skrip dijalankan.

Lari saja:

echo %cd%
Uddalak Biswas
sumber
%CD%adalah folder yang aktif saat ini, bukan folder, tempat file batch disimpan. Mereka bisa menjadi lokasi yang sama, tetapi seringkali tidak.
Stephan
-7

Itu akan menjadi %CD%variabel.

@echo off
echo %CD%

%CD% mengembalikan direktori saat ini skrip batch.

Ruel
sumber
35
% cd% mengembalikan direktori tempat skrip dijalankan, bukan direktori tempat skrip berada.
Misha Moroshko
4
ini hanya berfungsi jika skrip Anda tidak mengubah direktori kerja. Coba CD C:\Temp <CR> ECHO %CD%( <CR>adalah baris baru ...)
Dean Harding
6
Juga, jika Anda mengklik kanan pada skrip dan memilih "Run as Administrator", direktori awal saat ini adalah C: \ Windows \ System32 di mana pun skrip berada.
Cameron
Meskipun itu bukan jawaban langsung untuk pertanyaan OP, rasa fungsionalitas ini persis apa yang saya cari ketika saya menemukan pertanyaan ini. Terima kasih!
Zoltán
Tidak ada solusi lain yang diposting tampaknya berfungsi untuk saya di Win7 32bit cmd.exe, ini berguna bagi saya setidaknya.
Clifford
-8

Saya bekerja pada mesin Windows 7 dan saya akhirnya menggunakan baris di bawah ini untuk mendapatkan path folder absolut untuk skrip bash saya.

Saya mendapatkan solusi ini setelah melihat http://www.linuxjournal.com/content/bash-parameter-expansion .

#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
Jonas
sumber
2
OP bertanya tentang skrip shell Windows BAT / CMD, bukan bash.
bersaing pada