Як запустити програму за допомогою символьної посилання Windows


4

Як розробник, я встановлюю і запускаю багато додатків. Щоб отримати доступ до них з командного рядка, звичайний механізм додавання до змінної середовища PATH. Це нормально, але веде до брудної, великої, непроникної ПАТ.

Я хочу прибрати це за допомогою єдиного каталогу, напр. c:\dev який містить символічні посилання для всіх програм. Я можу створити символічні посилання з mklink, напр. mklink eclipse.exe c:\dev\eclipse\eclipse.exe.

Для прикладу Eclipse, коли я спробую нову символьну посилання, виникає помилка про бібліотеку-компаньйона. Для інших програм (наприклад, Notepad ++) я отримую іншу помилку.

Однак, коли я набираю той же шлях безпосередньо в командному рядку, наприклад, c:\dev\eclipse\eclipse.exe все працює.

Отже, символічна посилання eclipse.exe => c:\dev\eclipse.exe відрізняється від рівнини c:\dev\eclipse.exe. Я сподівався (зітхання) і припускаючи (doh!), Що символьна посилання працюватиме так само, як і безпосередньо набравши повний шлях.

IOW, чому symlink => c:\dev\eclipse.exe не еквівалентно набору тексту c:\dev\eclipse.exe?

Чи є щось навколо цього? Я знаю, що можу писати маленькі пакетні файли, але я сподівався уникнути цього (символічні посилання здаються чистішими).

Це ідіосинкразія Windows або ж 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\"

Нарешті, якщо я використовую символічну посилання mklink Test.bat "C:\Program Files\Test.bat" і викликати його з простим Test, він говорить:

Batch dir = "D:\"

Як ви можете бачити, поточний робочий каталог відрізняється в цьому випадку. Не дивно, що ваші програми скаржаться на файли, які вони очікують у каталозі виконуваного файлу.

Якщо ви не хочете додавати до PATH багато каталогів, просто додайте файл, який містить пакетні файли для кожного з ваших програм.


Як і в моєму питанні, я хотів уникнути багато маленьких пакетних файлів, але я приймаю вашу відповідь. Ключ полягає в тому, що програма / сценарій запускається з місця розташування, де розташована символічна посилання, а не кінцевої мети символьної посилання. Отже, навіть незважаючи на те, що "test.bat" c:\program files, символічна посилання працює d: . Це здається трохи неприємним, оскільки фактичний сценарій є c:\program files, не `d:`.
David Kerr

Я знайшов обхідний шлях, щоб переконатися, що символічна посилання не має .bat як розширення. Він працює тільки для Powershell, тому що він автозапуску виконуваних файлів без розширень. Щоб потім запустити його в CMD, потрібно зробити це start Test.
CMCDragonkai

Також хочу зазначити, що якщо ви використовуєте Cygwin, він буде правильно інтерпретувати символічні посилання і переконайтеся, що поточний робочий каталог перемикається на ціль символьної посилання.
CMCDragonkai

1

2 хороші відповіді вже пояснюють, що відбувається. Найкращий спосіб вирішити це: не створювати символічну посилання в папці 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 у поточній директорії. Він не знаходить його, тому намагається виконати eclipse.com, .bat і .cmd у поточному робочому каталозі. Він не знаходить цього, тому розширює пошук в тому ж порядку, що й шлях. Він знайде c: dev eclipse.bat і виконує те, що робить те, що ви хочете зробити.

Зверніть увагу, що я використовую запуск у файлі .bat, щоб отримати командний рядок після запуску програми. У деяких випадках це потрібно, особливо при роботі з програмами, які підтримують параметри командного рядка.

EDIT: додано% * для додавання підтримки параметрів. Його опціонально, але таким чином ви можете використовувати його. EDIT2: додано 2 різних .bat файли, щоб ви могли бачити, який з них найкраще працює. tnx DanielB за пропозицію.


cd це погана ідея, оскільки вона змінює середовище. Параметри також втрачаються.
Daniel B

@DanielB Ви можете бути більш конкретними? Щодо параметрів можна додати за допомогою% 1% 2% 3% 4 і т.д.
LPChip

3
Якщо ви входите notepad.bat myfile.txt Але це cd s до C:\Windows По-перше, він не може відкритися myfile.txt тому що це не те, де воно є. Також використовуйте %*. ;)
Daniel B

@DanielB хороша пропозиція. Додано. :)
LPChip
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.