Como faço para impedir que um atalho do Windows atualize seu caminho?

24

Durante o desenvolvimento do meu produto, meu dispositivo de teste possui várias versões do aplicativo instaladas ao mesmo tempo. No entanto, para obter os caminhos absolutos que meu aplicativo está usando para funcionar, preciso mudar ou renomear as pastas para que a versão que eu quero testar tenha o caminho certo, digamos C:\Program Files\My Company\My App\My App.exe. Fiz um atalho que tem como alvo esse caminho, mas se esse atalho for aberto quando nenhuma das versões tiver esse caminho, o atalho será atualizado automaticamente, pensando que o arquivo foi movido permanentemente. Isso causou falhas silenciosas até eu descobrir o que estava acontecendo. Eu não sabia que esse era um recurso dos atalhos do Windows até agora.

Então, minha pergunta é simples. Existe alguma maneira de desativar esse recurso? Globalmente, é bom, mas uma solução por atalho seria melhor.

Usar um arquivo em lotes em vez de um atalho é uma solução, mas estou me perguntando se há alguma maneira de fazer isso funcionar enquanto ainda estiver usando um atalho.

Estou usando o Windows 10 Home e o Windows 7 Home.

Kyle Delaney
fonte
10
O que eu fiz no passado é usar um arquivo em lotes ( .bat) com um comando simples, por exemplo start "" "C:\path\to\file.exe".
19417 Bob
1
Você já tentou criar um link simbólico (usando o mklinkcomando) em vez de um .lnkarquivo? Ou eles também são atualizados?
JAB
1
Os links simbólicos do @JAB não devem ser atualizados, mas têm certas desvantagens (exigem privilégios de administrador, não podem passar argumentos etc.). Embora eles funcionem bem se isso não for um problema.
19417 Bob
3
Eu pensei que fazer o atalho somente leitura funcionaria (tenho certeza que costumava fazer), mas depois de testar, vejo que não funciona. Isso ocorre porque o atalho não é reescrito; o destino é encontrado quando o atalho é executado. Apenas para que ninguém mais tente.
21720 Chris H
1
@ PetSerAl como eu disse acima, isso não funciona.
Chris H

Respostas:

13

Você pode usar o PowerShell! Esse pequeno script afeta o arquivo LNK para produzir o mesmo efeito que o uso do shortcututilitário clássico .

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

Para usá-lo, salve esse texto como um .ps1arquivo, por exemplo notrack.ps1. Se você ainda não o fez, siga as instruções na seção Habilitando scripts do wiki de tags do PowerShell . Em seguida, você pode executá-lo em um prompt do PowerShell:

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

Os atalhos ajustados dessa maneira não serão alterados quando o alvo for movido. Se um atalho como esse for quebrado, nada acontecerá quando você tentar abri-lo.

Reuni a matemática binária usada no meu script deste PDF da Microsoft de 48 páginas no formato LNK .

Ben N
fonte
25

Pare e desative o serviço: Cliente de rastreamento de link distribuído (TrkWks).

O Rastreamento de link distribuído rastreia links em cenários em que o link é feito para um arquivo em um volume NTFS, como atalhos de shell. Se esse arquivo for renomeado, movido para outro volume no mesmo computador, movido para outro computador ou em outros cenários semelhantes, o Windows usará o Rastreamento de Link Distribuído para encontrar o arquivo.

Origem: Rastreamento de Link Distribuído - Suporte da Microsoft

Steven
fonte
Boa ideia, mas notavelmente não funcionou. O atalho ainda encontrou o arquivo mesmo quando o caminho tinha um diretório mais longo.
Kyle Delaney
Tem certeza de que o serviço está parado? Depois de parar o serviço DLTC, mudei ou renomeei o executável. Quando executei o atalho, recebi o erro "Problema com atalho" informando que o destino estava ausente e solicitando a exclusão do atalho.
19717 Steven
10
A funcionalidade "encontrar o destino certo" remonta à série Windows 9x e antecede as versões NT do Windows. O DLT não existia no Windows 9x. Isso não quer dizer que o DLT seja irrelevante; O Windows irá utilizar DLT se isso ajuda para encontrar um destino do atalho.
MSalters
2
@ Steven Sim, tenho certeza que o serviço está desativado. No Windows 10, entrei em Serviços, encontrei o Distributed Link Tracking Client, cliquei no botão Parar, reiniciei o computador e verifiquei o serviço novamente. Há um botão Iniciar e o serviço não diz em execução. Os atalhos ainda se atualizam.
Kyle Delaney
8

Use o shortcut.execomando Opção -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
fonte
4
Infelizmente, o shortcut.exe não está mais disponível.
Daniel B
@DanielB Você está certo, eu esqueci que recuperei o shortcut.exe em algumas versões do Windows.
Sunzi 19/07
2
@ Daniel, você sabe quais versões do Windows possuem? Pode ser útil para algumas pessoas.
18717 gronostaj #
1
Aparentemente, faz parte do Windows NT4 Server Resource Kit. Foi originalmente disponibilizado em CD.
Daniel B
4

Você pode habilitar o seguinte GPO:

Configuração do Usuário \ Modelos Administrativos \ Menu Iniciar e Barra de Tarefas \ Não use o método baseado em pesquisa ao resolver atalhos de shell

chave de registro correspondente: HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\NoResolveSearch

Configuração do Usuário \ Modelos Administrativos \ Menu Iniciar e Barra de Tarefas \ Não use o método baseado em rastreamento ao resolver atalhos de shell

chave de registro correspondente:

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

Configuração do Usuário \ Modelos Administrativos \ Componentes do Windows \ Explorador de Arquivos \ Não rastrear atalhos de shell durante o roaming

chave de registro correspondente: HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\LinkResolveIgnoreLinkInfo

Swisstone
fonte
Como habilito um GPO? Onde encontro a configuração do usuário?
Kyle Delaney
no Windows 10, você pode clicar com o botão direito do mouse no botão Iniciar -> Executar e escrever: gpedit.msc -> clicar em OK, e poderá encontrar a configuração do usuário, etc. Digite: DWORD, com um valor de 1)
Swisstone
Eu recebi um erro. O Windows não conseguiu encontrar o gpedit.msc.
Kyle Delaney
OK, então você deve criar as chaves manualmente no registro. Se você não sabe como fazer isso, criei um arquivo .reg que você pode importar: pastebin.com/KdPYFwff basta copiar e colar o conteúdo em um novo arquivo que deve terminar com a extensão ".reg" (não. txt) e clique duas vezes sobre ele
Swisstone
Obrigado. Fiz isso, reiniciei o computador e verifiquei se as chaves do registro estavam no lugar usando o regedit. Os atalhos ainda se atualizam.
Kyle Delaney