CMD: Tambahkan path tanpa menggandakannya?

12

Untuk satu CMDsesi saya dapat dengan mudah menetapkan jalur baru:SET PATH=%PATH%;"insert custom path here"

Melakukannya dalam file batch tidak mempertimbangkan apakah jalur kustom sudah termasuk. Bagaimana cara menghindari menduplikasi (yaitu memeriksa apakah sudah terkandung dalam "string" PATH).

Catatan:

  1. Terkait: Bagaimana cara menambahkan variabel lingkungan yang ditentukan pengguna ke variabel sistem PATH di Windows 7?
  2. Terkait: Bagaimana saya bisa menambahkan entri secara permanen ke variabel PATH sistem, melalui baris perintah?
  3. Pertanyaan yang sama untuk UNIX: Tambahkan direktori ke $ PATH jika belum ada di sana
  4. Beberapa ops String "CMD" menjelaskan: http://ss64.com/nt/syntax-replace.html
Horst Walter
sumber
Harus ditunjukkan bahwa dalam konteks ini, duplikasi tidak berbahaya. Mungkin akan lebih masuk akal untuk membiarkan duplikasi terjadi daripada mencoba menghindarinya dan memperkenalkan risiko positif palsu.
Harry Johnston

Jawaban:

14

Mirip dengan jawaban MaddHackers, hanya lebih kompak.
echo %path%|find /i "%np%">nul || set path=%path%;%np%

%np%adalah jalur baru Anda, tentu saja Anda dapat menggunakan literal sebagai gantinya. Kegunaan: echo %path%|find /i "%np%">nulmencari jalur yang ada untuk sebuah string, membuang output. ||berarti mengeksekusi pada kegagalan, jadi itu berarti: Cari jalur untuk string yang akan ditambahkan, dan jika tidak ditemukan, tambahkan.

Sunting: Umumnya tidak diperlukan untuk mengutip lintasan, bahkan yang berisi spasi, tetapi jika Anda ingin mengutipnya , versi ini akan bekerja dengan lintasan yang dikutip ganda:
echo %path%|find /i "%np:"=%">nul || set path=%path%;%np%

Sunting: diubah findstr /i /c:menjadi find /ikarena findstrdapat salah menafsirkan beberapa urutan seperti yang dicatat oleh KubaOber dalam komentar

wmz
sumber
Bagus, saya tahu ada cara yang lebih bersih untuk melakukan itu ... masih lebih suka bash, tapi itu hanya saya: D Terima kasih atas bantuannya!
MaddHacker
Bagus, tetapi apakah itu bekerja dengan ruang di jalan? Saya telah mengujinya dengan jalur khusus saya, yang "dikutip dan dengan spasi" akan ditambahkan kembali. Satu hanya dikutip tetapi tampaknya tidak ada ruang yang berfungsi.
Horst Walter
1
@HorstWalter Ya itu harus bekerja dengan jalan apa pun (saya baru saja memeriksa dengan beberapa spasi termasuk). Apa yang Anda maksud dengan "dikutip"? Anda tidak perlu menggunakan tanda kutip di jalur, bahkan yang berisi spasi. Jika Anda %np%memuat tanda kutip - ya, itu akan menyebabkannya melakukan kesalahan.
wmz
2
@HorstWalter Lihat hasil edit saya. Ini hanya masalah jika Anda menggunakan variabel, menggunakan literal (seperti dalam echo %path%|findstr /i /c:"my path">nul || set path=%path%;"my path") akan berfungsi dengan baik.
wmz
1
@ wmz echo d\. | findstr /c:"d\."gagal, tetapi echo d\. | find "d\."berhasil
kembali Monica
4

Saya tahu ini kotor, tetapi ini seharusnya berhasil:

 SET PATH=$(echo $PATH | awk -F"%checkstr%" '{ print ($(NF-1) ~ 0) ? $PATH:%newpath% : $PATH; }')

di mana %checkstr%string untuk memeriksa dalam PATH dan %newpath%merupakan PATH baru untuk menambahkan ke PATH saat ini

Semoga itu bisa membantu, dan saya yakin ada cara yang lebih mudah, tetapi itu seharusnya bisa membantu untuk saat ini.

EDIT

Jadi jika Anda tidak ingin menambahkan alat UNIX ke Windows, Anda dapat mencoba sintaks kumpulan ini:

echo %PATH% | find /C /I "<string to find>" > out.txt 
set /p dne= < out.txt
if 0 EQU %dne% (set PATH=%PATH%;"<custom path>")
del out.txt

Ugh, bukan lebih cantik, dan dapat dilakukan sebagai satu baris jika Anda bisa mendapatkan perintah find pipe'ed untuk bekerja sebagai sub-perintah dalam pernyataan if ...

MaddHacker
sumber
2

Skrip berdasarkan jawaban oleh "wmz":

@ECHO off
ECHO java_home=%JAVA_HOME%
SET javapath=%JAVA_HOME%\bin
ECHO %path%|findstr /i /c:"%javapath:"=%">nul || set path=%path%;%javapath%
ECHO Path=%path%
PAUSE
Djangofan
sumber