0

我有一种情况,位于%AppData%\Microsoft\Windows\Start Menu\Programs文件夹和子文件夹中的快捷方式文件中的所有路径都指向不正确的驱动器号。这包括Target:值、Start In:值以及图标文件的所有路径。我想将它们全部更改X:\C:\

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

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

$folder = "C:\Temp\Shortcuts" 
[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() 
}
4

1 回答 1

1

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

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

...是真正的第 20 行。该错误的原因是因为您试图调用.Replace()on$WorkingDirectory而不是$link.WorkingDirectory. $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'
于 2018-09-20T19:41:41.280 回答