Ярлыки в Windows используют абсолютные пути. То есть вроде бы, как-то, вооружившись идеальным английским и накачанным виагрой напильником для реестра, можно заставить их понимать пути относительные. По слухам. Но реальность такова, что использовать ярлыки на флешке, или в какой-то структуре папок, которая может менять свое местоположение, нельзя. Это понятно: если мы задали путь E:\папка, а на другом компьютере наш флеш-драйв поимел букву диска уже M, то путь неверен, и ничего тут не попишешь.Какие решения? Их, в общих чертах, два: использовать сторонние лончеры или командные файлы. Первое решение недостаточно гибко, да и не встречал я еще лончера, такого, чтобы ах, а второе... Не терплю мигающие окна, которые неизбежно порождает интерпретатор cmd.exe. Неаккуратненько как-то. Можно и этот риф обойти, но опять громоздить сторонние программы, опять в гамаке и стоя. Ах, да - есть еще vb и js скрипты. Да, это посимпатичней. Но все-таки.

Однако человеческий гений, как известно, не только гнет взглядом сталь, но, поднатужившись, может даже воздерживаться от алкоголя весь вечер. Решение состоит в вызове функции соответствующей библиотеки. Поскольку библиотеки (dll) сами по себе из командной строки не вызываются, следует использовать команду (имя программы, на самом деле) rundll32. То есть вы создаете обычный ярлык, в строке запуска (поле Объект в свойствах) которого пишете строку вида: %windir%\system32\RunDll32.exe shell32.dll,ShellExec_RunDLL ".\папка\файл". Обратите внимание на точку перед первым слешем. Обязательно оставьте поле Рабочая папка пустым, и путь будет читаться относительно положения самого ярлыка. Напоминаю, что для перехода в родительскую папку вместо одной точки в начале надо ставить две, "..\..\" - на два уровня вверх и так далее.

Есть вероятность, что могут возникнуть проблемы у пользователей с урезанными правами, не проверял. Сообщите, если да.

  

41 комментариев на «Относительный путь в ярлыке»

  1. Kirill пишет:

    при открытие ярлыка не из файлового менеджера, а программно (из своего программного кода) метода не работает:(

    • павел рындин пишет:

      Мм… То есть при попытке запустить созданный по такому рецепту ярлык? Не пробовал. Может проще будет обойтись без таких ярлыков, раз уж все равно программа пишется?

      • Ева пишет:

        а как в чемаксе в Dragone Age прописать если там написыно Зaпycтитe игpy c пapaмeтpoм -enabledeveloperconsole.
        Для этoгo, в яpлыкe к зaпycкy игpы дoбaвьтe eгo пocлe кaвычeк.
        Пpимep, “C:\Games\Dragon Age\bin_ship\daorigins.exe” -enabledeveloperconsole
        я это не пойму

  2. роман пишет:

    Спасибо за совет. попробовал, получилось.
    Но возникли проблемы когда попытался создать ярлык для запуска программы с параметрами:
    .\Total_Commander_XP\TOTALCMD.EXE /I=”.\Profiles\Prof\main.ini” /F=”.\Profiles\Prof\ftp.ini”
    Выдается сообщение об ошибке:
    Windows не удалось найти ‘.\Total_Commander_XP\TOTALCMD.EXE /I=”.\Profiles\Prof\main.ini” /F=”.\Profiles\Prof\ftp.ini”‘. проверьте, что имя было введено правильно, и повторите попытку. Чтобы выполнить поиск файла, нажмите кнопку “пуск”, а затем выберите команду “Найти”.
    подскажите, пожалуйста. Можно ли обойти это?

    • Можно попробовать указать два отдельных параметра, каждый в своих кавычках:
      “запускаемая программа” “все ее параметры”. На простеньком примере у меня сработало. Ну и кавычки… Лучше бы их внутри параметра не было.

      • роман пишет:

        попробовал этот же ярлык, не получилось. попробовал и другой, где параметры без кавычек, тоже не прокатило. Жаль, идея то хорошая. Вы еще про скрипты упоминали. Не направите ли в нужную сторону?

        • Может эта зверюга пытается сама слеши как-то обработать?

          Кстати, обнаружил, что если файл лежит в той же папке, что и ярлык, то писать надо без “.\”.

          Насчет скриптов. В Windows встроен Windows Script Host (WSH) – движок, выполняющий скрипты (они же “сценарии”) на языках Visual Basic Script (vbs) и JScript (js, это майкрософтовский вариант javascript). по этим словам вы найдете достаточно информации, в том числе по русски.

          Ну и старый добрый bat. Читать для начала здесь http://doitq.ru/2006/03/28/zhdu-ukazaniy-mon-zheneral/
          п, насчет нелюбимых мною лишных окон: http://doitq.ru/2006/06/06/nevidimyiy-bat/

  3. [...] В продолжение темы о ярлыках. Если в свойствах ярлыка, в поле «Объект» указать строку %windir%explorer.exe “.”, а поле «рабочая папка» оставить пустым, то его запуск будет открывать в проводнике ту папку, в которой этот ярлык лежит. Его можно копировать в разные папки, не изменяя. [...]

    • fy пишет:

      попробуйте положить в корень какой-нибудь папки ярлык на другую папку, обзовите его “target”, создайте там же файлик “Desktop.ini” с следующим содержимым:
      [.ShellClassInfo]
      CLSID2={0AFACED1-E828-11D1-9187-B532F1E9575D}
      Flags=2
      и посмотрите в проводнике, что получится.
      примечание: чтобы убрать эффект, воспользуйтесь каким-нибудь сторонним файловым менеджером, достаточно переименования ярлыка из “target” в любое другое имя.
      К сожалению, сочетание этого и вышеописанного методов не дают желаемого эффекта.

      • павел рындин пишет:

        Это аналог junction в NTFS?
        Если не ошибаюсь, один из этих файлов (или оба) должен иметь атрибуты «скрытый» и «системный». Не писал о такой штуке, так как и раньше она глючила, а с каким-то из обновлений вообще перестала работать.

  4. VolanDoc пишет:

    Спасибо – помогло, однако исчезает иконка и ярлык становится обычным. Можно как-то подправить?

    • павел рындин пишет:

      В свойствах ярлыка есть кнопка «сменить значок». Там можно открыть как файл ico, так и файл приложения, содержащий иконки, и выбрать нужную. То есть для документа Word, например, иконки лежат в winword.exe.

  5. ld пишет:

    Скажите, пожалуйста, это касается предыдущего коммента — как прописать относительный путь к файлу с иконкой??

    • павел рындин пишет:

      Черт возьми… пожалуй, в рамках диалога выбора иконки никак. Не подумал сразу.
      Сейчас смотреть нет времени, но вы можете покопаться вот в каком направлении: создайте «ярлык интернета» (не обычный!) и откройте текстовым редактором. Это обычный ini-файл. Туда, вместо URL можно прописать путь к программе. п есть некоторая вероятность, что хитрой комбинацией слешей можно сделать путь относительным, и так же поступить с путем к иконке. Напоминаю, что обычный ярлык — файл бинарный, и так просто его не поредактируешь.

  6. andyceo пишет:

    Автору респект! Я попробовал этот метод, всё получилось. Да, к сожалению иконки к ярлыкам пропадают, и их приходится настраивать вручную. Что хорошо – видимо, иконки сохраняются в самом файле ярлыка, т.к. после удаления файла-источника иконки, иконка на ярлыке всё равно остаётся.

    Ещё раз, спасибо! очень нужный метод! Жаль только, что работает только под виндой, под линухом не запуститься…

  7. ppbd пишет:

    Автору респект.

  8. Alex пишет:

    Все это методы через Заднее место вобщето есть великий cmd.exe,
    пример:
    %windir%\system32\cmd.exe /C start /B /D .\Client .\Client\Client.exe
    пз папки Client запустить Client.exe

  9. m-a-n1 пишет:

    пример иконки у папки (относительный путь) для Windows XP и Vista

    Создайте файл desktop.ini
    и пропишите в нём

    [.ShellClassInfo]
    IconResource=..\MacSoft\mac_os2.ico,0
    IconFile=..\MacSoft\mac_os2.ico
    IconIndex=0

    где

    ..\ (любая буква диска)
    MacSoft\ (папка у которой меняется иконка
    mac_os2.ico,0 (сама иконка)

  10. павел рындин пишет:

    То папка, а разговор был о ярлыке…

  11. Castor пишет:

    Во-первых, спасибо!
    Уже давно пользуюсь Вашими относительными ярлыками и даже с параметрами и даже научился делать иконку из системного набора, написав в “Смене значка”
    %SystemRoot%\system32\SHELL32.dll

    Но вдруг беда:
    все мои относительные ярлыки не работают под Вистой!
    Что делать?
    Что Висте может не понравиться в строчке типа:
    %windir%\system32\RunDll32.exe shell32.dll,ShellExec_RunDLL “.\path_to_exe\my.exe” “.\path_to_parameter_file\my_parameter_file”

  12. павел рындин пишет:

    Вероятно, что-то в таком способе вызова DLL изменилось. Точно сказать не могу.

  13. рома пишет:

    не работает. не понятно что как нужно сделать

  14. naxaH пишет:

    %windir%\system32\cmd.exe /C start \directuse\total_commander\Totalcmd.exe + рабочая папка %cd% работает под windows 7 проверено. Ед тока хз че там с кавычками мутить чтобы пробел читался при выполнении команды.

    Второе решение:
    %windir%\system32\cmd.exe /c cd “\DirectUse\Total_Commander” & “totalcmd.exe” рабочая папка пусто. ТОже работает под windows 7

    Enjoy made faka!

  15. naxaH пишет:

    %comspec% /c cd /d “\DirectUse\Total_Commander”&& start “” totalcmd.exe

    Запуск + убирается cmd’шное окно

    • Игорь пишет:

      Здравствуйте! Объясните, пожалуйста, где в этой строке что
      %comspec% /c cd /d “\DirectUse\Total_Commander”&& start “” totalcmd.exe
      Уже по разному пробовал, скорее всего чего то не понимаю.

      Предположим, где-то есть папка “Папка1″, в ней есть файл “файл1.html”, делаем на него ярлык и кладем рядом с папкой “Папка1″, как я понял, чтобы ярлык заработал, строка в свойствах должна быть вот такой:
      %comspec% /c cd /d “\Папка1”&& start “” Файл1.html
      и рабочую папку оставляем пустой.
      Но вылазит на секундку окно с надписью “Системе не удалось найти указанный путь”(windows 7 64x).

      Подредактируйте, пожалуйста, чтобы работало=) буду очень благодарен!Заранее, большое спасибо!

      • Павел Рындин пишет:

        только не %comspec%, а %windir%\system32\cmd.exe
        попробуйте так

      • DarkKnight пишет:

        Если ярлык в тойже директории, то хватит просто %windir%\system32\cmd.exe /C start Файл1.html cd /d “\Папка1” – отвечает за перемещение к нужной директории, т.е. вместо \Папка1 надо прописать путь к директории, где хранится исполняемый файл

  16. JohnnySuperb пишет:

    Который раз уже захожу на этот сайт и каждый раз помогает!!!

  17. DarkKnight пишет:

    Проблему с пробелами можно решить при помощи использования имен в DOS-виде. Например открыть Far и нажать Ctrl+N, а далее путь указывать в соответствии с новыми именами.
    Когда я писал, то получилось примерно такое:
    %windir%\system32\cmd.exe /C start ..\PROGRAMS\!!!POR~1\MYHOME~1.3PO\MYHOME~1.EXE , а исходний путь был:
    ..\Programs\!!! Portable Apps\MyHomeLib 2.1.3 Portable\MyhomeLib.exe

Оставить комментарий