win10 快捷方式源文件移动后如何更新或者获取新的起始位置?

使用问题 · 774 次浏览
蒋鸿鸣 创建于 2023-07-18 18:31

如题,给一个文件创建快捷方式后这个快捷方式会显示“目标位置”,“目标”,“起始位置”三个属性,当源文件移动后“目标”,“起始位置”不会自动更新,但是却仍然能通过快捷方式打开源文件,也可以右键快捷方式后“打开文件所在位置”说明移动源文件并不影响快捷方式指向源文件,但是Quicker的“检查路径/获取文件信息”中的“Ink目标路径”却获取不到源路径,会报源文件不存在,这个问题怎么解决?能否通过快捷方式获取到移动后的源文件,或者能否通过某种方式更新快捷方式的“目标”,“起始位置”两个属性?后再操作?


回复内容
蒋鸿鸣 2023-07-18 18:35
#1

在快捷方式的属性中点击“打开文件所在的位置”文件夹被打开后快捷方式的“目标”,“起始位置”两个属性会自动更新,我不了解原理,请教各位论坛的朋友,是否可以用Quicker实现快捷批量更新?

蒋鸿鸣 2023-07-18 18:37
#2

另外看到一篇帖子https://blog.csdn.net/weixin_56337147/article/details/130701457可以使用 powershell 工具,批量修改快捷方式”的起始位置,奈何水平有限,确实看不动请各位大佬帮忙看看能否做成Quicker的动作?

蒋鸿鸣 最后更新于 2023-07-18 18:38
CL 回复 蒋鸿鸣 2023-07-18 18:57 :

这个帖子里说的还是比较清楚的。 复制代码,保存到后缀为ps1的文件中,然后修改上面3个路径。

第一个为快捷方式文件所在的目录。 第二个为快捷方式文件所指向的原始目录,第三个为快捷方式文件所指向的新目录。

然后右键执行这个ps1文件即可。 预先备份好以免出错。


$shortcutFolder = "D:\111\新建文件夹\" # 指定快捷方式所在的文件夹路径
$oldStartPath = "D:\1\" # 指定旧的起始文件夹路径
$newStartPath = "D:\2023\" # 指定新的起始文件夹路径
Get-ChildItem -Path $shortcutFolder -Filter *.lnk -Recurse | ForEach-Object {
    $shell = New-Object -ComObject WScript.Shell
    $shortcut = $shell.CreateShortcut($_.FullName)
    if ($shortcut.TargetPath.StartsWith($oldStartPath)) {
        $newTargetPath = $newStartPath + $shortcut.TargetPath.Remove(0, $oldStartPath.Length)
        $shortcut.TargetPath = $newTargetPath
        $shortcut.Save()
        Write-Host "目标已更新:" $_.FullName
    }
}
CL 最后更新于 2023-07-19 08:19
蒋鸿鸣 回复 蒋鸿鸣 2023-07-19 09:20 :

https://getquicker.net/Sharedaction?code=620f3ea5-703c-4c42-1ca3-08db8790d489这是我做的一个工作中整理文件常用的动作,该动作,您能帮忙看看怎么添加一个恢复快捷方式的步骤吗?或者有没有办法设计一个动作,选定快捷方式后执行该动作即可更新快捷方式的起始位置

CL 回复 蒋鸿鸣 2023-07-19 09:42 :

这种批量修改的,还是建议小心。脚本是一个比较安全的方式,可以在执行之前仔细确认代码。

你可以详细说明一下实际场景,说不定有更好的解决方式。

臭冬瓜 回复 蒋鸿鸣 2023-07-19 10:39 :

既然修改的办法自己无法办到,换一个思路呢?

根据实际情况(查找可执行文件路径),重新生成新的lnk文件,替换原有的lnk文件,不在原来的lnk上修改。

蒋鸿鸣 回复 臭冬瓜 2023-07-19 13:24 :

快捷方式和源文件都在不同的文件夹下,父级结构比较杂乱,不太可行。

蒋鸿鸣 回复 CL 2023-07-19 13:30 :

根据测试,win下的快捷方式在移动原文件后,快捷方式还是能定位到源文件的,而且通过属性中的“打开文件所在的位置”能自动更新快捷方式的起始位置。我在想能否利用这个达到批量的目的

CL 回复 蒋鸿鸣 2023-07-19 13:34 :

感觉这个只是windows在某个地方保存了移动位置的信息,并没有在快捷方式里。

或许重启电脑之后这个信息就没有了,而且从外面也没法知道这个信息。

蒋鸿鸣 回复 CL 2023-07-19 18:02 :

我实际测试不是的,不仅仅关机重启后还能通过属性中的“打开文件所在的位置”能自动更新快捷方式的起始位置,甚至将文件夹拷贝到虚拟机后还能实现

蒋鸿鸣 2023-07-19 13:32
#3

根据测试,win下的快捷方式在移动原文件后,快捷方式还是能定位到源文件的,而且通过属性中的“打开文件所在的位置”能自动更新快捷方式的起始位置,通过打开快捷方式也会更新,能否找到其机制后批量更新快捷方式的起始位置?

蒋鸿鸣 2023-07-19 18:06
#4

文件夹拷贝到虚拟机后测试


CL 回复 蒋鸿鸣 2023-07-20 07:34 :

没有查到相关资料。 感觉这里可能是根据相对路径判断的,可以试试,在拷贝过程中lnk和目标文件相对位置变化一下,看看还能不能找到。

另外找到了一篇英文资料,https://www.winhelponline.com/blog/how-to-change-shortcut-lnk-targets-in-bulk-using-script/

里面介绍了一个 Shortcut Search And Replace 工具,也可以试一下看看。

CL 回复 CL 2023-07-20 07:51 :

查到了一个相关的帖子:

[How do I stop a Windows shortcut from updating its path? - Super User](https://superuser.com/questions/1231074/how-do-i-stop-a-windows-shortcut-from-updating-its-path)

Windows 有一个Distributed Link Tracking Client (TrkWks)服务来跟踪快捷方式目标的改变。

Distributed Link Tracking tracks links in scenarios where the link is made to a file on an NTFS volume, such as shell shortcuts. If that file is renamed, moved to another volume on the same computer, moved to another computer, or moved in other similar scenarios, Windows uses Distributed Link Tracking to find the file.

Source: Distributed Link Tracking - Microsoft Support

蒋鸿鸣 2023-07-20 14:31
#5

感谢大佬,我看了,也翻到和我差不多困惑的问题,没找到好的解决办法,但是有个思路,“原贴”这里的代码我在PowerShell运行没有用,尝试改为

$wshShell = New-Object -ComObject wscript.shell $Shell = New-Object -ComObject shell.application # 指定特定的lnk文件路径 $lnkFilePath = 'G:\招投标及标书相关\新建文件夹\盾构隧道施工法.flv.lnk' $oFolder = $shell.Namespace((Get-Item $lnkFilePath).DirectoryName) $oItem = $oFolder.ParseName((Get-Item $lnkFilePath).Name) $oitem.Verbs() | ?{$_.Name -like "P&roperties"} | %{$_.DoIt()} Start-Sleep 1 $wshShell.SendKeys("%F") Start-Sleep 1 $wshShell.SendKeys("%{F4}") Start-Sleep 1 $wshShell.SendKeys("{Enter}") Start-Sleep 1


或者



$shortcutPath = "G:\招投标及标书相关\新建文件夹\盾构隧道施工法.flv.lnk" # 打开快捷方式属性 $shell = New-Object -ComObject WScript.Shell $shell.Exec("explorer.exe """ + $shortcutPath + """") Start-Sleep -Milliseconds 500 # 发送按键操作:Alt + Enter(打开属性窗口)、Alt + F (文件选项)、Alt + O (打开文件位置)、Alt + A (应用属性) $wshShell = New-Object -ComObject WScript.Shell $wshShell.SendKeys("%{ENTER}") Start-Sleep -Milliseconds 500 $wshShell.SendKeys("%F") Start-Sleep -Milliseconds 500 $wshShell.SendKeys("%O") Start-Sleep -Milliseconds 500 $wshShell.SendKeys("%A") Start-Sleep -Milliseconds 500 # 关闭快捷方式属性窗口 Stop-Process -Name "explorer" -Force Write-Host "已将快捷方式的目标属性更新为: [正确的目标路径]"


都没有用,但是看起来是个错的思路,我我哪里弄错了吗?

回复主贴