Powershell: измените букву диска всех моих ярлыков, которые начинаются с X: \ - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть ситуация, когда все пути в файлах ярлыков, которые находятся в папке и подпапках %AppData%\Microsoft\Windows\Start Menu\Programs, указывают на неправильную букву диска.Это включает в себя значение Target: , Start In: value и все пути к файлам значков.Я хотел бы изменить их все с X:\ на C:\

Есть пара, которые правильно указывают на C:\, но есть только несколько из них.

Вот код, с которым я работал.Я могу изменить TargetPath, но не значение WorkingDirectory.Я попытался удалить комментарий в строке 20, но это выдает ошибку о $null -значном выражении.Я также пытался дублировать бит для TargetPath до WorkingDirectory, но он не меняется:

$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() 
}

1 Ответ

0 голосов
/ 20 сентября 2018

Строка 20 в коде, который вы разместили, является конечным }, но я предполагаю, что ...

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

... - настоящая строка 20. Причина этой ошибкипотому что вы пытаетесь позвонить .Replace() на $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'
...