目录
Set-ExecutionPolicy RemoteSigned
本文前面是讲述过程,可以直接看最后的“总结”。
使用PowerShell脚本
创建.ps1文件
如果您需要批量替换多个快捷方式,可以使用PowerShell脚本来自动化该过程。以下是一个简单的PowerShell脚本示例,可以将指定目录中的所有快捷方式替换为其目标文件:
$shortcutPath = "C:\Users\YourUserName\Desktop\Shortcuts" # 替换为您的快捷方式目录路径
$targetPath = "C:\Users\YourUserName\Desktop\TargetFiles" # 替换为您的目标文件目录路径
Get-ChildItem $shortcutPath -Filter *.lnk | ForEach-Object {
$shortcut = $_.FullName
$target = Join-Path $shortcutPath $_.Name.Replace(".lnk","")
$shell = New-Object -ComObject WScript.Shell
$original = $shell.CreateShortcut($shortcut).TargetPath
Copy-Item $original $target -Force
}
请将上述代码复制到记事本或其他文本编辑器中,并将“$shortcutPath”和“$targetPath”变量替换为您的实际目录路径。然后将文件保存为“ReplaceShortcuts.ps1”(或其他名称,以.ps1为扩展名)。
执行.ps1文件
接下来,打开PowerShell并导航到保存脚本的目录。运行以下命令以启用脚本执行:
Set-ExecutionPolicy RemoteSigned
然后,运行以下命令以运行脚本:
.\ReplaceShortcuts.ps1
脚本将自动替换指定目录中的所有快捷方式。请注意,脚本将使用目标文件的名称来替换快捷方式的名称,因此请确保目标文件的名称与快捷方式的名称相匹配,以避免出现混淆。
此外,脚本将在替换快捷方式时覆盖现有的快捷方式,因此请确保在运行脚本之前备份任何重要的快捷方式。
希望这个PowerShell脚本可以帮助您批量替换多个快捷方式。如果您需要更多关于PowerShell的帮助,请参考Microsoft官方文档。
指令解释(不重要,建议跳过)
Set-ExecutionPolicy RemoteSigned
"Set-ExecutionPolicy RemoteSigned"是一个PowerShell命令,用于设置PowerShell脚本的执行策略。PowerShell执行策略是一种安全机制,用于控制哪些脚本可以在系统上运行。
在默认情况下,PowerShell的执行策略是Restricted,这意味着不允许任何脚本运行。为了运行自己编写的脚本,需要将执行策略更改为更宽松的选项。
"Set-ExecutionPolicy RemoteSigned"命令将执行策略设置为RemoteSigned,这意味着只有在本地计算机上创建的脚本可以自由运行。如果脚本来自其他计算机,则需要手动确认才能运行它们。这有助于防止恶意脚本在系统上运行。
请注意,更改执行策略可能会对系统的安全性产生影响。如果您不确定如何更改执行策略或是否应该更改执行策略,请咨询系统管理员或安全专家。
如果您已经确定需要更改执行策略,并且您信任从其他计算机下载的脚本,则可以使用"Set-ExecutionPolicy RemoteSigned"命令来启用脚本执行。
执行策略设置为RemoteSigned后,如果您不再需要运行脚本,可以将其设置回Restricted。这有助于提高系统的安全性,因为它将限制脚本的运行。
要将执行策略设置回Restricted,请打开PowerShell并运行以下命令:
Set-ExecutionPolicy Restricted
这将禁止在系统上运行任何脚本,包括本地计算机上创建的脚本。如果您需要再次运行脚本,请使用"Set-ExecutionPolicy RemoteSigned"命令将执行策略设置回RemoteSigned。
Get-ChildItem $shortcutPath -Filter *.lnk | ForEach-Object { $shortcut = $_.FullName $target = Join-Path $targetPath $_.Name.Replace(".lnk","") Copy-Item $target $shortcut -Force }
这是一个PowerShell脚本,用于批量替换指向快捷方式的目标文件路径。下面是每一行的解释:
1. `Get-ChildItem $shortcutPath -Filter *.lnk`: 获取指定路径下所有扩展名为“.lnk”的文件。
2. `ForEach-Object { ... }`: 对于每个文件执行以下操作。
3. `$shortcut = $_.FullName`: 获取当前文件的完整路径。
4. `$target = Join-Path $targetPath $_.Name.Replace(".lnk","")`: 获取目标文件的完整路径。这里使用`Join-Path`函数将目标文件路径与目标路径组合起来,并使用`Replace`函数删除“.lnk”扩展名。
5. `Copy-Item $target $shortcut -Force`: 将目标文件复制到快捷方式的路径,并使用`-Force`参数覆盖现有文件(如果存在)。
因此,此脚本的目的是将指向快捷方式的目标文件路径替换为指定目录中的实际文件。例如,如果您的快捷方式目录路径为“D:\111”,目标文件目录路径为“D:\222”,则此脚本将查找所有“.lnk”文件(即快捷方式文件)并将其目标文件路径替换为“D:\222”目录中的实际文件路径。
Get-ChildItem $shortcutPath -Filter *.lnk | ForEach-Object {
$shortcut = $_.FullName
$target = Join-Path $shortcutPath $_.Name.Replace(".lnk","")
$shell = New-Object -ComObject WScript.Shell
$original = $shell.CreateShortcut($shortcut).TargetPath
Copy-Item $original $target -Force
}
使用Get-ChildItem
命令获取指定路径中的所有“.lnk”文件。对于每个文件,脚本使用Join-Path
函数将其与快捷方式文件夹路径组合起来,以获取快捷方式文件的完整路径。接下来,使用New-Object
命令创建一个WScript.Shell
对象,以便可以使用它来获取快捷方式文件指向的原始文件路径。最后,使用Copy-Item
命令将原始文件复制到指定的目标文件夹中。
请注意,此脚本假定快捷方式文件的扩展名为“.lnk”,并且目标文件夹中不存在与原始文件同名的文件。如果存在同名文件,将使用-Force
参数覆盖它。
如果您的快捷方式文件扩展名不是“.lnk”,请将第5行中的“.lnk”替换为相应的扩展名。如果您的目标文件夹中存在同名文件,请删除或重命名它们,以免被覆盖。
此外,如果您的文件路径包含中文,可能会出现一些问题。如果出现问题,请尝试将路径转义,例如:
$shortcutPath = "D:\111"
$shortcutPath = $shortcutPath -replace '\\', '\\\\'
这将在路径中的每个反斜杠(“\”)前添加另一个反斜杠,以便正确转义路径中的任何特殊字符。
请注意,此脚本可能需要一些时间来完成,具体取决于快捷方式文件的数量和原始文件的大小。在脚本运行期间,请不要关闭PowerShell窗口或中断脚本的执行,以免发生错误。
$shell = New-Object -ComObject WScript.Shell
$original = $shell.CreateShortcut($shortcut).TargetPath
Copy-Item $original $target -Force
`$shell = New-Object -ComObject WScript.Shell` 这一行创建了一个COM对象,即Windows脚本宿主对象,用于操作快捷方式。在这个对象上调用`CreateShortcut`方法,可以获取指定快捷方式文件的原始文件路径。
`$original = $shell.CreateShortcut($shortcut).TargetPath` 这一行使用`CreateShortcut`方法获取指定快捷方式文件的快捷方式对象,并使用`.TargetPath`属性获取该快捷方式指向的原始文件路径。这个原始文件路径将被复制到目标文件夹中。
`Copy-Item $original $target -Force` 这一行使用`Copy-Item`命令将原始文件复制到指定的目标文件夹中。`$original`是之前获取的指向快捷方式的原始文件路径,`$target`是指定的目标文件夹路径。使用`-Force`参数可以覆盖目标文件夹中已存在的同名文件。
因此,整个代码块的作用是,对于每个指向文件的快捷方式文件,使用Windows脚本宿主对象获取其指向的原始文件路径,并将其复制到指定的目标文件夹中。
报错
报错1 不修改执行策略
如果不修改执行策略,将会报错:
.\ReplaceShortcuts.ps1
.\ReplaceShortcuts.ps1 : 无法加载文件 D:\ReplaceShortcuts.ps1,因为在此系统上禁止运行脚本。有关详
细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID=135170 中的 about_Execution_Policies。
所在位置 行:1 字符: 1
+ .\ReplaceShortcuts.ps1
+ ~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : SecurityError: (:) [],PSSecurityException
+ FullyQualifiedErrorId : UnauthorizedAccess
修改:在执行.\ReplaceShortcuts.ps1之前,修改执行策略。
Set-ExecutionPolicy RemoteSigned
报错2 用户权限不够
如果用户权限不够,将会报错:
Set-ExecutionPolicy RemoteSigned
Set-ExecutionPolicy : 对注册表项“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell”的
访问被拒绝。 要更改默认(LocalMachine)作用域的执行策略,请使用“以管理员身份运行”选项启动 Windows PowerShell。要更改当
前用户的执行策略,请运行 "Set-ExecutionPolicy -Scope CurrentUser"。
所在位置 行:1 字符: 1
+ Set-ExecutionPolicy RemoteSigned
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : PermissionDenied: (:) [Set-ExecutionPolicy], UnauthorizedAccessException
+ FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.PowerShell.Commands.SetExecutionPolicyComma
nd
方法一:请使用“以管理员身份运行”选项启动 Windows PowerShell。再 “Set-ExecutionPolicy RemoteSigned”。
方法二:不用管理员身份,而是执行“Set-ExecutionPolicy -Scope CurrentUser”。
报错3 .ps1里的路径设置为中文
如果.ps1里的地址路径设置为中文,将会报错:
.\ReplaceShortcuts.ps1
Get-ChildItem : 找不到路径“D:\瑰紡”,因为该路径不存在。
所在位置 D:\复制\ReplaceShortcuts.ps1:4 字符: 1
+ Get-ChildItem $shortcutPath -Filter *.lnk | ForEach-Object {
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (D:瑰紡:String) [Get-ChildItem], I
temNotFoundExceptio n
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand
在PowerShell中,可以使用中文路径作为变量,但是在某些情况下可能会导致问题。具体而言,如果您的脚本需要访问包含中文字符的路径,可能会遇到以下问题:
1. PowerShell无法识别路径:如果路径包含非标准字符,例如中文字符或其他特殊字符,PowerShell可能无法正确识别路径。这可能会导致脚本无法正常工作。
2. 其他应用程序无法访问路径:如果路径包含非标准字符,其他应用程序可能无法访问该路径。这可能会导致其他应用程序无法打开或保存文件。
为了避免这些问题,建议尽可能使用标准字符集(例如英文字符、数字和标点符号)来命名文件和路径。如果必须使用中文字符或其他非标准字符,可以尝试使用Unicode转义序列来表示这些字符。
例如,如果您的路径包含中文字符“桌面”,可以将其表示为“\u684c\u9762”。这样,您的脚本就可以正确地识别路径,并且其他应用程序也可以访问该路径。
总之,虽然在PowerShell中可以使用中文路径,但是使用标准字符集来命名文件和路径是最好的做法,可以避免潜在的问题。如果必须使用非标准字符,可以尝试使用Unicode转义序列来表示这些字符。
笔者在【控制面板】中修改,在【控制面板】中找到【区域】 -> 【管理】 -> 【更改系统区域设置】 -> 勾选【Beta版:使用Unicode UTF-8 提供全球语言支持】,重启电脑后解决该问题。
报错4 .ps1路径错误
在执行.\ReplaceShortcuts.ps1之
.\ReplaceShortcuts.ps1
.\ReplaceShortcuts.ps1 : 无法将“.\ReplaceShortcuts.ps1”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称
的拼写,如果包括路径,请确保路径正确,然后再试一次。
所在位置 行:1 字符: 1
+ .\ReplaceShortcuts.ps1
+ ~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (.\ReplaceShortcuts.ps1:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
方法一:使用“cd”指令跳转到ReplaceShortcuts.ps1所在文件夹,执行
cd D:\path\to\folder
其中,path\to\folder
是你要访问的文件夹的路径。例如,如果你要访问D盘的一个名为"Documents"的文件夹,可以使用以下命令:“cd D:\Documents” 这个命令会将当前工作目录更改为D盘的Documents文件夹,这样你就可以在PowerShell中访问该文件夹中的文件和文件夹了。
再执行.\ReplaceShortcuts.ps1。
方法二:使用绝对路径,方法是输入 “&”+“绝对路径”
& "D:\复制\ReplaceShortcuts.ps1"
报错5 找到的原文件文件名后面都带有“ - 快捷方式”,
找到的原文件文件名后面都带有“ - 快捷方式”,
为了解决这个问题,您需要修改以下代码:
$original = $shell.CreateShortcut($shortcut).TargetPath
将其替换为以下代码:
$original = $shell.CreateShortcut($shortcut).TargetPath.Replace(" - 快捷方式","")
这将获取指向快捷方式的原始文件路径,并使用`.Replace()`方法将“ - 快捷方式”从文件名中删除。然后,使用修改后的文件名复制文件到目标文件夹中。
请注意,这将仅删除文件名中的“ - 快捷方式”,而不会影响文件的扩展名或路径。如果您的文件名中包含其他特殊字符,可能需要进行其他修改以确保脚本正常运行。
但是,经过笔者实验,该方法不行,该方法中
Get-ChildItem $shortcutPath -Filter *.lnk | ForEach-Object {
$shortcut = $_.FullName
$target = Join-Path $shortcutPath $_.Name.Replace(".lnk","")
$shell = New-Object -ComObject WScript.Shell
$original = $shell.CreateShortcut($shortcut).TargetPath
Copy-Item $original $target -Force
}
举例:"D:\111" 文件夹里的快捷方式“xxx.mp3 - 快捷方式”,其目标为“D:\复制\xxx.mp3”,那么
$shortcutPath = "D:\111"
$targetPath = "D:\222"
$shortcut 的内容是 “xxx.mp3 - 快捷方式.lnk”
$target的内容是"D:\111\xxx.mp3 - 快捷方式"
$original的内容是“D:\复制\xxx.mp3”
此时,执行复制操作“Copy-Item $original $target -Force”,会将$original的mp3文件替换掉$target,文件名称还是 “xxx.mp3 - 快捷方式.lnk”,很明显,这个文件后缀不是“mp3”不能直接打开。
因此,需要执行的复制操作是“Copy-Item $original $targetPath -Force”,将original的mp3文件复制到$targetPath = "D:\222"路径下。
总结
新建.ps1文件,写入
$shortcutPath = "D:\111" # 替换为您的快捷方式目录路径
$targetPath = "D:\222"
Get-ChildItem $shortcutPath -Filter *.lnk | ForEach-Object {
$shortcut = $_.FullName
$target = Join-Path $shortcutPath $_.Name
$shell = New-Object -ComObject WScript.Shell
$original = $shell.CreateShortcut($shortcut).TargetPath
Copy-Item $original $targetPath -Force
}
修改文件名为“ReplaceShortcuts.ps1”(或其他名称,以.ps1为扩展名)。
然后打开 PowerShell,找到“ReplaceShortcuts.ps1”所在文件夹,执行
Set-ExecutionPolicy RemoteSigned CurrentUser
修改执行策略。然后使用相对路径执行“ReplaceShortcuts.ps1”
.\ReplaceShortcuts.ps1
"D:\111" 文件夹里的快捷方式的原文件将被复制到 "D:\222"中。