Apakah ada cara dalam skrip kumpulan Windows untuk mengembalikan jalur absolut dari nilai yang berisi nama file dan / atau jalur relatif?
Diberikan:
"..\"
"..\somefile.txt"
Saya perlu path absolut relatif terhadap file batch.
Contoh:
- "somefile.txt" terletak di "C: \ Foo \"
- "test.bat" terletak di "C: \ Foo \ Bar".
- Pengguna membuka jendela perintah di "C: \ Foo" dan memanggil
Bar\test.bat ..\somefile.txt
- Dalam file batch "C: \ Foo \ somefile.txt" akan berasal dari
%1
windows
batch-file
relative-path
absolute-path
Nathan Taylor
sumber
sumber
realpath
untuk normalisasi jalur yang kuat.SET FilePath=%CD%\%1
sehingga bisa sepertiC:\Foo\Bar\..\..\some\other\dir\file.txt
. Program tampaknya memahami jalan yang rumit.Jawaban:
Dalam file batch, seperti dalam program C standar, argumen 0 berisi path ke skrip yang sedang dieksekusi. Anda bisa menggunakan
%~dp0
untuk mendapatkan hanya bagian jalur dari argumen ke-0 (yang merupakan skrip saat ini) - jalur ini selalu merupakan jalur yang sepenuhnya memenuhi syarat.Anda juga bisa mendapatkan lintasan yang memenuhi syarat penuh dari argumen pertama Anda dengan menggunakan
%~f1
, tetapi ini memberikan lintasan sesuai dengan direktori kerja saat ini, yang jelas bukan yang Anda inginkan.Secara pribadi, saya sering menggunakan
%~dp0%~1
idiom dalam file batch saya, yang mengartikan argumen pertama relatif terhadap path dari batch yang dieksekusi. Itu memang memiliki kekurangan: gagal total jika argumen pertama sepenuhnya memenuhi syarat.Jika Anda perlu mendukung jalur relatif dan absolut, Anda dapat menggunakan solusi Frédéric Ménez : untuk sementara mengubah direktori kerja saat ini.
Berikut adalah contoh yang akan menunjukkan masing-masing teknik ini:
Jika Anda menyimpan ini sebagai c: \ temp \ example.bat dan jalankan dari c: \ Users \ Public as
c: \ Users \ Public> \ temp \ example.bat .. \ windows
... Anda akan mengamati output berikut:
dokumentasi untuk set pengubah yang diizinkan pada argumen batch dapat ditemukan di sini: https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/call
sumber
%0
dan%1
juga:%~dpnx0
untuk path + nama sepenuhnya terkualifikasi dari batchfile itu sendiri,%~dpnx1
untuk path + nama penuh kualifikasi argumen pertama [jika itu nama file sama sekali]. (Tapi bagaimana Anda bisa memberi nama file pada drive yang berbeda jika Anda tidak akan memberikan info path lengkap pada commandline?)d:\foo\..\bar\xyz.txt
masih dapat dinormalisasi. Saya sarankan menggunakan pendekatan ini dengan jawaban @ axel-heider di bawah ini (menggunakan subrutin batch - maka Anda dapat melakukannya pada variabel apa pun, bukan hanya variabel bernomor).Saya menemukan kebutuhan serupa pagi ini: bagaimana mengubah jalur relatif menjadi jalur absolut di dalam skrip perintah Windows.
Berikut ini triknya:
sumber
pushd .
mencegah masalah ini.Sebagian besar jawaban ini tampak gila karena rumit dan sangat bermasalah, ini milik saya - ini berfungsi pada variabel lingkungan apa pun, tidak ada
%CD%
atauPUSHD
/POPD
, ataufor /f
omong kosong - hanya fungsi batch lama. - Direktori & file bahkan tidak harus ada.sumber
%~f1
hanya kependekan dari%~dpfn1
- jadi, silakan gunakan%~f1
saja. 🙂 - dalam format panjang~
berarti menghapus tanda kutip,d
berarti drive,p
berarti path,n
sendirian akan nama file tanpa ekstensi, tetapifn
berarti nama file dengan ekstensi. yang1
berarti argumen pertama. - (Saya yakin format ini ada sebelum Windows 7.)Tanpa harus memiliki file batch lain untuk meneruskan argumen (dan menggunakan operator argumen), Anda dapat menggunakan
FOR /F
:di mana
i
in%%~fi
adalah variabel yang didefinisikan pada/F %%i
. misalnya. jika Anda mengubahnya/F %%a
maka bagian terakhir akan menjadi%%~fa
.Untuk melakukan hal yang sama di prompt perintah (dan bukan dalam file batch) ganti
%%
dengan%
...sumber
cd
perintah tersebut tidak serta-merta mengubah%CD%
variabel lingkungan (jika misalnya Anda berada di driveD:
dan jalur target Anda aktifC:
)cd /D D:\on.other.drive
FOR /F %%i IN ("..\relativePath") DO echo absolute path: %%~fi
akan gagal jika..\relativePath
ruang berisifor /?
menyarankan untuk menggunakan huruf kapital untuk nama variabel, untuk menghindari kebingungan dengan parameter substitusi/F
tidak akan berfungsi di jalur yang tidak ada, dan itu akan menyelesaikan karakter wildcard. Jika Anda menginginkannya, hebat, tetapi jika Anda menginginkan fungsionalitasnya/F
, maka Anda hanya perlu menggunakantokens
kata kunci:FOR /F "tokens=*" %%I IN ("..\relative Path\*") DO echo absolute path: %%~fI
Ini untuk membantu mengisi kekosongan dalam jawaban Adrien Plisson (yang harus ditingkatkan segera setelah dia mengeditnya ;-):
Seseorang dapat menangani
%0
dan%1
juga:%~dpnx0
untuk drive + path + nama + ekstensi + dari batchfile itu sendiri,%~f0
juga cukup;%~dpnx1
untuk drive + lintasan + nama + ekstensi sepenuhnya argumen pertama [jika itu nama file sama sekali],%~f1
juga cukup;%~f1
akan bekerja terlepas dari bagaimana Anda menentukan argumen pertama Anda: dengan jalur relatif atau dengan jalur absolut (jika Anda tidak menentukan ekstensi file saat penamaan%1
, itu tidak akan ditambahkan, bahkan jika Anda menggunakan%~dpnx1
- namun.Tapi bagaimana pula Anda memberi nama file pada drive yang berbeda jika Anda tidak akan memberikan info path lengkap pada commandline di tempat pertama?
Namun,
%~p0
,%~n0
,%~nx0
dan%~x0
mungkin berguna, jika Anda tertarik pada jalan (tanpa hurufkandar), nama file (tanpa ekstensi), nama file penuh dengan ekstensi atau ekstensi nama file hanya. Tetapi perhatikan, saat%~p1
dan%~n1
akan bekerja untuk mengetahui jalur atau nama argumen pertama,%~nx1
dan%~x1
tidak akan menambahkan + menunjukkan ekstensi, kecuali Anda sudah menggunakannya pada commandline.sumber
%~dpnx1
adalah bahwa ia memberikan path yang sepenuhnya memenuhi syarat dari argumen relatif ke direktori saat ini , sementara OP menginginkan path relatif ke direktori di mana file batch berada .%~dpnx1
memberikan jalur argumen 1 yang sepenuhnya memenuhi syarat. Tidak relatif sama sekali, dan tidak relatif terhadap dir saat ini juga. Inid
untuk drive,p
untuk path,n
untuk nama file sans suffix,x
untuk suffix,1
untuk argumen pertama. - Dan pertanyaan Nathan adalah: "Apakah ada cara untuk mengembalikan jalur absolut dari nilai yang berisi nama file dan / atau jalur relatif?"Anda juga dapat menggunakan fungsi batch untuk ini:
sumber
Perbaikan kecil untuk solusi hebat BrainSlugs83 . Umum untuk memungkinkan penamaan variabel lingkungan keluaran dalam panggilan.
Jika dijalankan dari
C:\project
output adalah:sumber
Saya belum melihat banyak solusi untuk masalah ini. Beberapa solusi memanfaatkan traversal direktori menggunakan CD dan lainnya menggunakan fungsi batch. Preferensi pribadi saya adalah untuk fungsi batch dan khususnya, fungsi MakeAbsolute yang disediakan oleh DosTips.
Fungsi ini memiliki beberapa manfaat nyata, terutama karena tidak mengubah direktori kerja Anda saat ini dan kedua bahwa jalur yang dievaluasi bahkan tidak harus ada. Anda dapat menemukan beberapa kiat bermanfaat tentang cara menggunakan fungsi di sini juga.
Berikut ini contoh skrip dan hasilnya:
Dan hasilnya:
Saya harap ini membantu ... Ini tentu membantu saya :) PS Terima kasih lagi untuk DosTips! Kamu keren!
sumber
Anda bisa menggabungkannya.
itu terlihat aneh dengan \ .. \ di tengah jalan Anda tetapi berfungsi. Tidak perlu melakukan hal-hal gila :)
sumber
echo %~dp0..\SomeFile.txt
Dalam contoh Anda, dari Bar \ test.bat, DIR / B / S .. \ somefile.txt akan mengembalikan path lengkap.
sumber
PowerShell sangat umum hari ini, jadi saya sering menggunakannya sebagai cara cepat untuk memanggil C # karena itu memiliki fungsi untuk hampir semua:
Agak lambat, tetapi fungsi yang didapat sulit dikalahkan kecuali tanpa menggunakan bahasa skrip yang sebenarnya.
sumber
solusi stijn bekerja dengan subfolder di bawah
C:\Program Files (86)\
,sumber
File Lihat semua jawaban lain
Direktori
Dengan
..
menjadi jalur relatif Anda, dan dengan asumsi Anda saat ini berada diD:\Projects\EditorProject
:cd .. & cd & cd EditorProject
(jalur relatif)mengembalikan jalur absolut misalnya
D:\Projects
sumber
sumber