Як зупинити ярлик Windows від оновлення шляху?


24

Під час розробки продукту мій тестовий пристрій має кілька версій програми, встановлених одночасно. Однак, щоб отримати абсолютні шляхи, якими працює моя програма, мені потрібно вимкнути або перейменувати папки, щоб версія, яку я хочу перевірити, мала правильний шлях, скажімо C:\Program Files\My Company\My App\My App.exe. Я зробив ярлик, націлений на цей шлях, але якщо ця ярлика відкрита, коли жодна з версій наразі не має цього шляху, ярлик автоматично оновлюється сам, вважаючи, що файл перемістився назавжди. Це спричинило мовчазні збої, поки я не виявив, що відбувається. Я до цього часу не знав, що це особливість ярликів Windows.

Тож моє запитання просте. Чи є можливість вимкнути цю функцію? В усьому світі це добре, але краще рішення для скорочення.

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

Я використовую Windows 10 Home та Windows 7 Home.


10
Що я робив у минулому, це використовувати пакетний файл ( .bat) з простою командою, наприклад start "" "C:\path\to\file.exe".
Боб

1
Ви намагалися створити символічне посилання (за допомогою mklinkкоманди) замість .lnkфайлу? Або вони також оновлюються?
JAB

1
Символьні посилання @JAB не слід оновлювати, але мають певні недоліки (потрібні приватні адміністратори, не можна передавати аргументи тощо). Хоча вони працюють добре, якщо це не проблема.
Боб

3
Я думав, що зробити ярлик лише для читання (я впевнений, що раніше), але перевіривши, я бачу, що це не так. Це тому, що ярлик не переписаний; ціль виявляється при запуску ярлика. Просто так ніхто більше не намагається.
Кріс Н

1
@PetSerAl Як я вже говорив вище, це не працює.
Кріс Н

Відповіді:


13

Ви можете використовувати PowerShell! Цей маленький сценарій вибиває файл LNK, щоб отримати такий же ефект, як і класична shortcutутиліта.

$linkfile = Resolve-Path $args[0]
$bytes = [IO.File]::ReadAllBytes($linkfile)
$bytes[0x16] = $bytes[0x16] -bor 0x36
[IO.File]::WriteAllBytes($linkfile, $bytes)

Щоб використовувати його, збережіть цей текст у вигляді .ps1файлу, наприклад notrack.ps1. Якщо ви ще цього не зробили, дотримуйтесь інструкцій у розділі Включення сценаріїв у вікі тегів PowerShell . Тоді ви можете запустити його з підказки PowerShell:

.\notrack.ps1 C:\path\to\my\shortcut.lnk

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

Я зібрав двійкову математику, використану в моєму сценарії, з цього 48-сторінкового PDF в форматі Microsoft в форматі LNK .


25

Зупинення та відключення послуги: Клієнт відстеженого розподіленого посилання (TrkWks).

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

Джерело: Розподілене відстеження посилань - Підтримка Microsoft


Гарна ідея, але на диво це не вийшло. Ярлик все-таки знайшов файл, навіть коли шлях був на одну директорію довший.
Кайл Делані

Ви впевнені, що послуга зупинена? Після припинення служби DLTC я перемістив або перейменував виконуваний файл. Коли я запустив ярлик, у мене з’явилася помилка «Проблема із ярликом», яка стверджує, що ціль відсутня та запропонувала видалити ярлик.
Стівен

10
Функція «знайти потрібну ціль» датується серією Windows 9x і передує NT-версіям Windows. DLT не існував у Windows 9x. Це не означає, що DLT не має значення; Windows , буде використовувати DLT , якщо це допомагає знайти мета швидкого доступу.
MSalters

2
@Steven Так, я впевнений, що послугу вимкнено. У Windows 10 я зайшов у Служби, знайшов клієнта відстеженого розподіленого посилання, натиснув кнопку зупинки, перезапустив комп’ютер та ще раз перевірив послугу. Там є кнопка «Пуск», і сервіс не говорить про запуск. Ярлики все одно оновлюються.
Кайл Делані

8

Використовуйте shortcut.exeкоманду Опція -s:

shortcut: [-? -h -f -c -r -s] [[-t] target [[-n] name]] [-d working directory]
        [-a Arguments] [-i Iconfile] [-x Icon index] [-u {all|[natdix]}]
        [-l logfile]

  -? -h        This help
  -f           Force overwrite of an existing short cut
  -c           Change existing shortcut
  -s           Make shortcut non tracking (Stupid)
  -r           Resolve broken shortcut
  -t target    Specifies the target of the shortcut
  -n name      Specifies the file name of the shortcut file
  -d directory Specifies the directory name to start the application in
  -a arguments Specifies the arguments passed when the shortcut is used
  -i iconfile  Specifiles the file the icon is in
  -x index     Specifies the index into the icon file
  -u [spec]    Dumps the contents of a shortcut. 'all' is the same as 'natdix'
               but the letters of 'natdix' can be specified to display specific
               fields in the shortcut (repeats allowed, and order followed)
  -l logfile   record error messages in specified file

4
На жаль, shortcut.exe більше не доступний.
Даніель Б

@DanielB Ви маєте рацію, я забув, що я врятував shortcut.exe через деякі версії Windows.
Sunzi

2
@Daniel Ви знаєте, у яких версіях Windows є? Це може бути корисно для деяких людей.
gronostaj


4

Ви можете ввімкнути таку групову групу:

Конфігурація користувача \ Адміністративні шаблони \ Меню "Пуск" та панель завдань \ Не використовуйте метод на основі пошуку при вирішенні ярликів оболонок

відповідний ключ реєстру: HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\NoResolveSearch

Конфігурація користувача \ Адміністративні шаблони \ Меню "Пуск" та панель завдань \ Не використовуйте метод на основі відстеження при вирішенні ярликів оболонок

відповідний ключ реєстру:

HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\NoResolveTrack

Конфігурація користувача \ Адміністративні шаблони \ Компоненти Windows \ Провідник файлів \ Не відстежуйте ярлики оболонок під час роумінгу

відповідний ключ реєстру: HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\LinkResolveIgnoreLinkInfo


Як увімкнути GPO? Де знайти конфігурацію користувача?
Кайл Делані

у Windows 10 ви можете натиснути правою кнопкою миші кнопку пуску -> Запустити та записати: gpedit.msc -> натиснути ОК, тоді ви зможете знайти налаштування користувача тощо. АБО ви можете створити ключі реєстру, які я вказав ( Тип: DWORD, зі значенням 1)
Swisstone

Я отримав помилку. Windows не вдалося знайти gpedit.msc.
Кайл Делані

Гаразд, тому ви повинні створити ключі в реєстрі вручну. Якщо ви не знаєте, як це зробити, я створив .reg файл, який ви можете імпортувати: pastebin.com/KdPYFwff просто скопіюйте та вставте вміст у новий файл, який повинен закінчуватися розширенням ".reg" (не. txt) і двічі клацніть по ньому
Swisstone

Спасибі. Я це зробив, перезавантажив комп’ютер і перевірив, що ключі реєстру тепер існують за допомогою regedit. Ярлики все одно оновлюються.
Кайл Делані
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.