Строка 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'