Tambahkan direktori dan semua subdirektori ke variabel PATH dengan satu entri

19

Saya punya direktori di folder rumah saya di mana saya menempatkan perangkat lunak command-line (CMD_Software). Saya menempatkan masing-masing perangkat lunak di direktori sendiri di dalam CMD_Software untuk menghindari kekacauan.

Saya ingin membuat satu entri dalam variabel PATH saya yang akan memungkinkan akses ke CMD_Software dan semua direktori yang dikandungnya dari baris perintah.

Saya mencoba C:\Users\myuser\CMD_Software\*tetapi itu tidak berhasil. Itulah titik di mana saya kehabisan ide.

Harap dicatat bahwa saya tidak mencoba untuk menetapkan jalur baru saat berada di terminal, saya mencoba untuk mengatur jalur baru di "Variabel Lingkungan" yang tersedia di tab "Tingkat Lanjut" dari System Properties.

Landon Brainard
sumber
Apakah Anda mencoba sesuatu seperti `C: \ Users \ myuser \ CMD_Software *`?
terdon
4
Saya rasa ini tidak mungkin.
Harry Johnston

Jawaban:

16

Variabel PATH tidak mendukung wildcard atau rekursi. Ini dengan desain.

Ada dua kemungkinan penyelesaian yang saya gunakan pada kesempatan:

  • Buat direktori dengan file batch sederhana dan tambahkan direktori itu ke PATH. Setiap file batch dapat meluncurkan program yang Anda inginkan, misalnya:

    :: CMD_Software.bat: start CMD_Software
    @C:\Users\myuser\CMD_Software\CMD_Software.exe %*
    

    Baris pertama adalah komentar, yang kedua dimulai dengan @untuk menghindari menampilkan perintah yang sedang dijalankan, dan %*digunakan untuk meneruskan argumen baris perintah apa pun ke EXE.

  • Tambahkan alias ke CMD.EXE:

    DOSKEY CMD_Software="C:\Users\myuser\CMD_Software\CMD_Software.exe" $*
    

    Ini pada dasarnya diterjemahkan CMD_Softwaredalam command prompt untuk semua setelah tanda sama dengan. The $*diganti dengan argumen yang disediakan.

Saya lebih suka pendekatan kedua, karena Anda dapat mengelompokkan semua alias dalam satu file (lihat saklar "/ MACROFILE" di DOSKEY /?) Dan minta autorun setiap kali penerjemah perintah mulai menggunakan pengaturan registri (lihat kunci "AutoRun" di CMD /?).

Kelemahan dari metode kedua adalah alias hanya berfungsi pada awal baris perintah. Ini bisa menjadi masalah jika Anda ingin rantai perintah. Misalnya, CLS & CMD_Softwaretidak akan berfungsi kecuali jika Anda menempatkan alias di baris terpisah menggunakan tanda kurung:

CLS & (
CMD_Software
)

Setiap kali ini menjadi masalah, saya hanya mundur ke pendekatan file batch.

efotinis
sumber
Terima kasih! Metode pertama bekerja sangat baik untuk saya, terutama karena saya tidak perlu mengacaukan registri ketika saya mentransfer data saya antar komputer. Ini juga cukup rapi dan nyaman karena Anda hanya menghabiskan sedikit lebih banyak waktu untuk membuat file kelelawar ketika Anda mendapatkan utilitas tersebut.
cyqsimon
Sayangnya saya harus mengubah pernyataan saya sebelumnya dengan cepat. Saya telah mengalami masalah aneh dengan skrip secara acak keluar setengah jalan melalui eksekusi setelah mengadopsi metode pertama. Secara khusus, wget untuk Windows tampaknya menikmati membunuh skrip saya setelah selesai mengunduh. Saya telah menyia-nyiakan dua jam terakhir untuk menyelesaikan masalah skrip saya, tetapi akhirnya saya mencoba membuang semua exes ke direktori root tunggal, dan masalah-masalah hilang semuanya. Karena itu saya sangat menyarankan agar berhati-hati sebelum ada yang menggunakan metode ini.
cyqsimon
4

Inilah yang saya gunakan untuk memperbaiki masalah. Salin skrip ini di bawah dan simpan sebagai FIXPATH.BATke folder yang telah Anda tambahkan ke PATHvariabel lingkungan. Contohnya:

C: \ Users \ myuser \ CMD_Software \

Sekarang setiap kali Anda perlu menjalankan program yang ada di dalam subfolder, katakan ...

C: \ Users \ myuser \ CMD_Software \ unixutils \ grep.exe
atau
C: \ Users \ myuser \ CMD_Software \ imagetools \ exiftool.exe

Jalankan fixpathdahulu lalu masukkan perintah (misalnya grepatau exiftool) seperti:

Microsoft Windows [Versi 6.3.9600]
(c) 2013 Microsoft Corporation. Seluruh hak cipta.

C: \ Users \ myuser> fixpath
C: \ Users \ myuser> exiftool


FIXPATH.BAT

setlocal EnableDelayedExpansion
cd / D% ~ dp0

untuk / R %% d di (.) do (
    set "dirs =! dirs!; %% d"
)

path =% path%! dir!
(endlocal
    set "ret =% PATH%"
)
cmd / K "judul [#] Jalur Tetap [#] && jalur% ret%"
keluar / B

Terima kasih atas jawaban @ VonC

Vinayak
sumber
1

Letakkan subdirektori "programlinks \" di bawah ... \ CMD_Software (atau di mana saja, sebenarnya) dan isi dengan tautan simbolik atau hardlink ke setiap executable yang ingin Anda akses. Maka satu entri di PATH untuk ... \ programlinks sudah cukup.

kreemoweet
sumber
1
Masalah utama dengan itu adalah bahwa jika ada perpustakaan yang dapat dieksekusi tergantung terletak di direktori yang sama dengan exe, mereka tidak akan digunakan. Atau setidaknya itulah yang terjadi dengan upaya saya dengan ini.
zero298
Komentar luar biasa, @ zero298. Meskipun saya ingin, jika ada yang yakin 100% dan dapat mengonfirmasi ini benar untuk silakan berpadu. (Karena metode ini dinyatakan paling bersih dari semuanya.)
Henrik
-1

Jika Anda tidak terlalu kecewa dengan ide tersebut, Anda dapat menyalin alat baris perintah Anda ke direktori Windows \ System32. Kemudian Anda dapat menjalankannya dari direktori mana saja, seperti ping atau ipconfig.

sunting
Setelah sedikit bermain-main, ini IS mungkin. Anda hanya perlu menggunakan titik koma untuk membatasi direktori Anda. Katakanlah Anda memiliki program di "folder1" dan "folder2". Anda akan menulis jalur Anda seperti ini:

c:\folder1\;c:\folder2\;c:\folder3\;    etc....

Kemudian Anda dapat memanggil program di direktori mana pun langsung dari baris perintah. AFAIK tidak ada cara lain untuk melakukan ini hanya dengan satu baris.

Info pendukung: http://en.wikipedia.org/wiki/PATH_(variable)

Lee Harrison
sumber
1
Ini tidak masuk akal. 1. Ini akan menghapus konten variabel PATH sebelumnya . 2. Variabel PATH hanya akan berisi folder, bukan subdirektori (hasil yang diinginkan). 3. Meminjam program.batsebagai %PATH%\program.batlebih atau kurang kebalikan dari apa PATH dirancang untuk.
Dennis