ฉันจะเริ่มแอปพลิเคชันผ่านทาง symlink ของ Windows ได้อย่างไร


4

ในฐานะนักพัฒนาฉันติดตั้งและเรียกใช้แอปพลิเคชั่นมากมาย ในการเข้าถึงสิ่งเหล่านี้จากบรรทัดคำสั่งกลไกปกติในการเพิ่มแอพพลิเคชั่นเข้ากับตัวแปรสภาพแวดล้อม PATH ไม่เป็นไร แต่นำไปสู่เส้นทางที่ยุ่งเหยิงขนาดใหญ่และไม่ยอมรับ

ฉันต้องการจัดระเบียบสิ่งนี้ด้วยการมีไดเรกทอรีเดียวเช่น c:\dev ที่มี symlink สำหรับแอปพลิเคชันทั้งหมด ฉันสามารถสร้าง symlink ได้ดีด้วย mklink เช่น mklink eclipse.exe c:\dev\eclipse\eclipse.exe.

สำหรับตัวอย่าง Eclipse เมื่อฉันลอง symlink ใหม่ฉันได้รับข้อผิดพลาดเกี่ยวกับไลบรารีที่แสดงร่วม สำหรับแอปอื่น ๆ (เช่น Notepad ++) ฉันพบข้อผิดพลาดอื่น

อย่างไรก็ตามเมื่อฉันพิมพ์เส้นทางเดียวกันลงในบรรทัดคำสั่งโดยตรงเช่น c:\dev\eclipse\eclipse.exe ทุกอย่างทำงานได้

ดังนั้น symlink eclipse.exe => c:\dev\eclipse.exe แตกต่างจากธรรมดา c:\dev\eclipse.exe. ฉันหวังว่า (ถอนหายใจ) และสมมติว่า (doh!) ว่า symlink จะทำงานเหมือนกับพิมพ์เส้นทางเต็มโดยตรง

IOW ทำไมเป็น symlink => c:\dev\eclipse.exe ไม่เทียบเท่ากับการพิมพ์ c:\dev\eclipse.exe?

มีวิธีแก้ไขไหม? ฉันรู้ว่าฉันสามารถเขียนไฟล์แบตช์เล็ก ๆ ได้ แต่ฉันหวังว่าจะหลีกเลี่ยงสิ่งนั้นได้ (symlink ดูสะอาดกว่า)

นี่เป็น Windows idiosyncrasy หรือ Linux เหมือนกันหรือไม่

คำตอบ:


5

ให้ฉันอธิบายปัญหาด้วยตัวอย่าง ฉันสร้างไฟล์แบตช์เดียวแบบง่าย test.bat ใน C:\Program Files มีเนื้อหาดังต่อไปนี้:

@echo Batch dir = "%~dp0"

ตอนนี้จาก D:\ ถ้าฉันเรียกไฟล์แบตช์ด้วย C:\Program Files\Test, มันบอกว่า:

Batch dir = "C:\Program Files\"

หากฉันแก้ไข PATH โดยใช้ set path=%path%;C:\Program Files และเรียกใช้ไฟล์แบตช์ด้วยวิธีง่าย ๆ Test, มันบอกว่า:

Batch dir = "C:\Program Files\"

ในที่สุดถ้าฉันสร้าง symlink โดยใช้ mklink Test.bat "C:\Program Files\Test.bat" และเรียกใช้มันด้วยวิธีง่ายๆ Test, มันบอกว่า:

Batch dir = "D:\"

อย่างที่คุณเห็นไดเรกทอรีการทำงานปัจจุบันแตกต่างกันในกรณีนี้ ไม่น่าแปลกใจที่แอพพลิเคชั่นของคุณจะบ่นเกี่ยวกับไฟล์ที่พวกเขาคาดหวังในไดเรกทอรีของไฟล์สั่งการที่หายไป

หากคุณไม่ต้องการเพิ่มไดเรกทอรีจำนวนมากลงใน PATH เพียงแค่เพิ่มไดเรกทอรีที่มีแบตช์ไฟล์สำหรับแต่ละแอปของคุณ


ในคำถามของฉันฉันต้องการหลีกเลี่ยงแบตช์ไฟล์จำนวนมาก แต่ฉันยอมรับคำตอบของคุณ กุญแจสำคัญคือโปรแกรม / สคริปต์ถูกเรียกใช้จากตำแหน่งที่ตั้ง symlink ไม่ใช่เป้าหมาย symlink ขั้นสุดท้าย ดังนั้นแม้ว่า "test.bat" จะอยู่ใน c:\program filessymlink กำลังทำงานจาก d: . ดูเหมือนว่าคนทำบาปเล็ก ๆ น้อย ๆ เพราะสคริปต์ที่แท้จริงอยู่ใน c:\program filesไม่ใช่ `d: '
David Kerr

ฉันพบวิธีแก้ปัญหาสำหรับสิ่งนี้เพื่อให้แน่ใจว่า symlink ไม่มี .bat เป็นส่วนขยาย มันใช้งานได้กับ Powershell เท่านั้นเพราะจะทำงานอัตโนมัติเริ่มทำงานโดยไม่มีส่วนขยาย หากต้องการเรียกใช้ใน CMD คุณต้องทำ start Test.
CMCDragonkai

นอกจากนี้ฉันต้องการชี้ให้เห็นว่าถ้าคุณใช้ Cygwin มันจะตีความ symlink อย่างถูกต้องและตรวจสอบให้แน่ใจว่าไดเรกทอรีการทำงานปัจจุบันถูกเปลี่ยนเป็นเป้าหมาย symlink
CMCDragonkai

1

2 คำตอบที่ดีแล้วอธิบายว่าเกิดอะไรขึ้น วิธีที่ดีที่สุดในการแก้ปัญหานี้คือการไม่สร้าง symlink ในโฟลเดอร์ c: \ dev แต่สร้างไฟล์. cmd หรือ. bat ในโฟลเดอร์ c: \ dev ของคุณแทน

คุณใช้ Eclipse เป็นตัวอย่างดังนั้นฉันจะใช้อันนั้นเช่นกัน

ใน c: \ dev คุณสร้างไฟล์ชื่อ eclipse.bat ด้วยเนื้อหาต่อไปนี้:

@echo off
start "c:\dev\eclipse\eclipse.exe %*"

หรือถ้าคุณต้องการตั้งค่าพา ธ เนื่องจากโปรแกรมหาไฟล์ไม่พบให้ใช้:

@echo off
cd /d c:\dev\eclipse
start "eclipse.exe %*"

ตอนนี้ถ้าคุณพิมพ์ eclipse มันจะค้นหา eclipse.exe ใน dir ปัจจุบันก่อน ไม่พบจึงลองใช้ eclipse.com, .bat และ. cmd ในไดเรกทอรีการทำงานปัจจุบัน ไม่พบดังนั้นจึงขยายการค้นหาในลำดับเดียวกันกับพา ธ มันจะค้นหา c: \ dev \ eclipse.bat และดำเนินการนั้นซึ่งทำในสิ่งที่คุณต้องการ

หมายเหตุฉันใช้ start ในไฟล์. bat เพื่อให้คุณได้รับพรอมต์คำสั่งของคุณกลับมาหลังจากเริ่มแอปพลิเคชัน ในบางกรณีจำเป็นต้องมีโดยเฉพาะอย่างยิ่งเมื่อทำงานกับโปรแกรมที่สนับสนุนตัวเลือกบรรทัดคำสั่ง

แก้ไข: เพิ่ม% * เพื่อเพิ่มการรองรับพารามิเตอร์ มันเป็นทางเลือก แต่เป็นวิธีที่คุณสามารถใช้ได้ EDIT2: เพิ่มไฟล์. bat ที่แตกต่างกัน 2 ไฟล์เพื่อให้คุณสามารถดูว่าไฟล์ไหนที่เหมาะกับคุณที่สุด tnx DanielB สำหรับคำแนะนำ


cd เป็นความคิดที่ไม่ดีเพราะมันเปลี่ยนสภาพแวดล้อม พารามิเตอร์จะสูญหายเช่นกัน
Daniel B

@DanielB คุณเจาะจงมากขึ้นได้ไหม? สำหรับพารามิเตอร์สามารถเพิ่มได้โดยใช้% 1% 2% 3% 4 ฯลฯ ...
LPChip

3
ถ้าคุณจะเข้า notepad.bat myfile.txt แต่มัน cd ถึง C:\Windows ก่อนจะเปิดไม่ได้ myfile.txt เพราะนั่นไม่ใช่ที่ที่มันอยู่ นอกจากนี้ยังใช้ %*. ;)
Daniel B

@DanielB คำแนะนำที่ดี เพิ่มมัน :)
LPChip
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.