PowerShell脚本优化需求:删除旧快捷方式并创建新指向的快捷方式
修正后的PowerShell脚本及问题解决说明
完整可运行脚本
# 获取用户输入 $Location = Read-Host -Prompt '请输入目标路径' $oldname = Read-Host -Prompt '请输入旧文件夹名称' $newname = Read-Host -Prompt '请输入新文件夹名称' # 复制旧文件夹内容到新文件夹(加-Force确保覆盖已有内容) Copy-Item -Path "$Location\$oldname" -Destination "$Location\$newname" -Recurse -Force $targetFolder = "$Location\$newname" # 删除新文件夹中所有.lnk快捷方式 Get-ChildItem -Path $targetFolder -Filter *.lnk -File -Recurse | Remove-Item -Force # 创建指向新文件夹中exe的标准快捷方式 $shell = New-Object -ComObject WScript.Shell # 遍历所有exe文件,逐个创建对应快捷方式 Get-ChildItem -Path $targetFolder -Filter *.exe -File -Recurse | ForEach-Object { $exeFullPath = $_.FullName # 快捷方式放在exe同目录,和exe同名 $shortcutPath = Join-Path -Path $_.DirectoryName -ChildPath "$($_.BaseName).lnk" $shortcut = $shell.CreateShortcut($shortcutPath) $shortcut.TargetPath = $exeFullPath $shortcut.WorkingDirectory = $_.DirectoryName # 设置起始位置为exe所在路径 $shortcut.Save() } # 释放COM对象,避免内存占用 [System.Runtime.Interopservices.Marshal]::ReleaseComObject($shell) | Out-Null
原脚本问题及解决细节
1. 删除.lnk无效的原因
- 路径未指定正确目标:原命令
Get-ChildItem -Recursive *.lnk没指定新文件夹路径,默认搜索当前工作目录,改成指定-Path $targetFolder才会定位到新文件夹内的lnk文件。 - 变量未解析:原
Remove-Item '$folder\*'用了单引号,$folder不会被替换成实际路径,必须改用双引号。另外添加-Force参数可强制删除受系统保护的lnk文件。
2. 创建快捷方式的错误纠正
- 混淆符号链接和Windows快捷方式:原代码用
New-Item -ItemType SymbolicLink创建的是NTFS符号链接,这和带“起始位置”属性的.lnk快捷方式不是同一类型。必须借助WScript.ShellCOM对象才能创建标准Windows快捷方式,并设置起始位置等专属属性。 - 正确设置属性:通过
CreateShortcut()生成快捷方式对象后,指定TargetPath为exe文件的完整路径,WorkingDirectory为exe所在目录(即“起始位置”),最后调用Save()保存生效。
内容的提问来源于stack exchange,提问作者BrianOrion
相关产品推荐
相关产品推荐

