Powershell:编辑以 X:\ 开头的所有快捷方式的驱动器号



我遇到这样一种情况,即位于%AppData%MicrosoftWindowsStart MenuPrograms文件夹和子文件夹中的快捷方式文件中的所有路径都指向不正确的驱动器号。这包括目标:值、起始位置:值以及图标文件的所有路径。我想将它们全部从X:更改为C:

有几个正确地指向C:但只有少数。

这是我正在使用的代码。我可以更改TargetPath但不能更改WorkingDirectory值。我尝试删除第 20 行的注释,但这会产生有关$null值表达式的错误。我也尝试复制该位以供TargetPathWorkingDirectory,但它没有改变:

$folder = "C:TempShortcuts" 
[string]$from = "X:" 
[string]$to = "C:" 
$list = Get-ChildItem -Path $folder -Recurse  | Where-Object { $_.Attributes -ne "Directory"} | select -ExpandProperty FullName 
$obj = New-Object -ComObject WScript.Shell 
ForEach($lnk in $list) 
{ 
$obj = New-Object -ComObject WScript.Shell 
$link = $obj.CreateShortcut($lnk) 
[string]$path = $link.TargetPath  
[string]$path = [string]$path.Replace($from.tostring(),$to.ToString()) 
#   [string]$path = $link.WorkingDirectory
#   [string]$path = [string]$path.Replace($from.tostring(),$to.ToString()) 
#If you need workingdirectory change please uncomment the below line. 
#$link.WorkingDirectory = [string]$WorkingDirectory.Replace($from.tostring(),$to.ToString()) 
$link.TargetPath = [string]$path 
$link.Save() 
}

您发布的代码中的第 20 行是尾随},但我假设这个......

#$link.WorkingDirectory = [string]$WorkingDirectory.Replace($from.tostring(),$to.ToString()) 

。是实线 20。 该错误的原因是您尝试在$WorkingDirectory而不是$link.WorkingDirectory上调用.Replace()$WorkingDirectory,如果未在任何地方设置,则将评估为$null.

更正后,PowerShell 提供了自己的字符串替换运算符:-replace-ireplace不区分大小写,-creplace区分大小写。 所有这些运算符的第一个操作数是正则表达式,由于正则表达式中的反斜杠表示特殊字符,因此您需要像这样转义搜索模式中的...

[string]$from = "X:\"

然后,您可以使用以下命令更改WorkingDirectory属性的驱动器号...

$link.WorkingDirectory = [string] $link.WorkingDirectory -replace $from.tostring(),$to.ToString()

。或。。。

$link.WorkingDirectory = [string] $link.WorkingDirectory -ireplace $from.tostring(),$to.ToString()

请注意,$link.WorkingDirectory$from$to已经是[String]类型,因此[String]转换和对.ToString()的调用是不必要的,可以删除...

$link.WorkingDirectory = $link.WorkingDirectory -replace $from,$to

您可能会进行的一个微小优化是在搜索模式中添加一个锚点,这样它就不会费心搜索超出[String]绝对开头的驱动器号......

[string]$from = "^X:\"

另外,由于您使用的是PowerShell 3+,而不是像这样过滤掉目录...

$list = Get-ChildItem -Path $folder -Recurse  | Where-Object { $_.Attributes -ne "Directory"}

。您可以过滤这样的文件...

$list = Get-ChildItem -Path $folder -Recurse -File

更好的是,您也可以使用-Filter参数仅包含扩展名为.lnk的文件......

$list = Get-ChildItem -Path $folder -Recurse -File -Filter '*.lnk'

最新更新