Как остановить ярлык 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-страничного Microsoft PDF в формате 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команду Option -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
Sunzi
источник
4
К сожалению, shortcut.exe больше не доступен.
Даниэль Б
@DanielB Вы правы, я забыл, что я спас shortcut.exe в некоторых версиях Windows.
Sunzi
2
@ Даниил, ты знаешь, в каких версиях Windows он есть? Это может быть полезно для некоторых людей.
Гроностай
1
Очевидно, это часть Windows NT4 Server Resource Kit. Первоначально он был доступен на CD.
Даниэль Б
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

Swisstone
источник
Как включить GPO? Где я могу найти конфигурацию пользователя?
Кайл Делани
в Windows 10 вы можете щелкнуть правой кнопкой мыши на кнопке «Пуск» -> «Выполнить и написать»: gpedit.msc -> нажмите «ОК», тогда вы сможете найти конфигурацию пользователя и т. д.… ИЛИ вы можете создать ключи реестра, которые я указал ( Тип: DWORD, со значением 1)
Swisstone
Я получил ошибку. Windows не может найти gpedit.msc.
Кайл Делани
Итак, вы должны создать ключи вручную в реестре. Если вы не знаете, как это сделать, я создал файл .reg, который вы можете импортировать: pastebin.com/KdPYFwff, просто скопируйте и вставьте содержимое в новый файл, который должен заканчиваться расширением «.reg» (нет. txt) и двойной щелчок по нему
Swisstone
Спасибо. Я сделал это, перезагрузил компьютер и проверил, что ключи реестра теперь на месте с помощью regedit. Ярлыки все еще обновляются.
Кайл Делани