У меня есть сумасшедшие сетевые администраторы, которые всегда меняют UNC-путь к моему рабочему каталогу. Используя пример домена, чтобы проиллюстрировать изменения, клянусь, я видел по крайней мере эти четыре разных UNC в одном каталоге и файлах за последние 6 месяцев:
\\contoso\Projects\rhinoexhibit\
\\contoso\Design\Projects\rhinoexhibit\
\\contoso.com\Design\Projects\rhinoexhibit\
\\city.contoso.com\Departments\Design\Projects\rhinoexhibit\
\\city.contoso.com\Departments\AlphaDesignGroup\Projects\rhinoexhibit\
Я тоже пользуюсь.Файлы LNK, которые оба ссылаются непосредственно на файл в поле «Цель»:
\\contoso\Projects\rhinoexhibit\rhinospecifications.pdf
а также .LNK-файлы, которые ссылаются на приложение для открытия файла с определенными параметрами (здесь я использую Foxit Reader для открытия PDF-файла на определенной странице) в поле «Цель»:
"C:\Program Files (x86)\FOXIT READER\Foxit Reader.exe" /A page=37 "\\contoso\Projects\rhinoexhibit\rhinospecifications.pdf"
Эти каталоги находятся на общих ресурсах корпоративной сети, и у меня нет доступа для изменения UNC на общие ресурсы или использования какого-либо перенаправления, поэтому изменение ответа Терренса сработало для меня лучше всего. Поскольку я был новичком в PowerShell, мне пришлось выяснить, как его использовать, поэтому я дам пошаговые инструкции о том, как использовать мою модификацию его превосходного сценария:
- Используя Блокнот, вставьте приведенный ниже код в новый текстовый документ. Сохраните документ как Edit-LNK-files.ps1 в каталоге, который легко найти и быстро набрать (например, C:\MyPowerShells)
- В Блокноте измените параметр
$oldString
(строка 4), чтобы он содержал строку, которую вы хотите найти, и параметр $newString
(строка 7), чтобы он содержал строку, которую вы хотите заменить. Отредактируйте параметр $searchPath
(строка 10), чтобы указать каталог, в котором вы находитесь.LNK файлы для редактирования находятся постоянно.
Кроме того, вы можете указать эти переменные позже по своему усмотрению, запустив сценарий из командной строки PowerShell и отредактировав параметры (например, & "C:\MyPowerShells\Edit-LNK-files.ps1" -oldString E:\ -newString D:\ -searchPath "C:\My LNKs\"
- Запустите Windows Powershell от имени администратора: Пуск> Все программы> Стандартные> Windows PowerShell, щелкните правой кнопкой мыши Windows PowerShell и выберите Запуск от имени администратора.
- В Powershell введите
set-executionpolicy remotesigned
и нажмите Enter
- Введите
Y
и нажмите Enter, чтобы разрешить PowerShell запускать сценарий, который вы только что создали в Блокноте (вы можете изменить это после того, как закончите, чтобы обеспечить безопасность вашей системы).
- Введите
& "C:\MyPowerShells\Edit-LNK-files.ps1"
- Нажмите Enter, чтобы выполнить "Dry Run" (Отличная идея, Терренс! но я поменял это на дефолт)
- Просмотрите вывод "Пробного прогона" - пути изменились соответствующим образом? Если нет, измените переменные
$newString
и $oldString
соответствующим образом, затем повторите шаги 6-8, чтобы повторить пробный прогон. В противном случае перейдите к шагу 9.
- Если пробный запуск выглядит хорошо, повторите шаг 6, но на этот раз добавьте параметр -RealRun, чтобы он выглядел как
& "C:\MyPowerShells\Edit-LNK-files.ps1" -RealRun
. Теперь, когда вы нажмете Enter, это на самом деле изменит.LNK файлы
Вот отредактированный скрипт:
[CmdletBinding()]
Param(
[Parameter(Mandatory=$False,Position=1)]
[string] $oldString="\\contoso\Projects\rhinoexhibit\",
[Parameter(Mandatory=$False,Position=2)]
[string]$newString="\\city.contoso.com\Departments\AlphaDesignGroup\Projects\rhinoexhibit\",
[Parameter(Mandatory=$False,Position=3)]
[string]$searchPath="C:\My LNKs\",
[switch]$RealRun
)
$shell = new-object -com wscript.shell
$filesFound= 0
if ( $RealRun ) {
write-host "Executing real run" -foregroundcolor red -backgroundcolor black
} else {
write-host "Executing dry run" -foregroundcolor green -backgroundcolor black
}
dir $searchPath -filter *.lnk -recurse | foreach {
$lnk = $shell.createShortcut( $_.fullname )
$oldPath= $lnk.targetPath
$oldArgs= $lnk.Arguments
$lnkRegex = ",*" + [regex]::escape( $oldString )
if ( $oldPath -match $lnkRegex ) {
$newPath = $oldPath -replace $lnkRegex, $newString
write-host "Found: " $_.fullname -foregroundcolor yellow -backgroundcolor black
write-host " Replace: " $oldPath
write-host " With: " $newPath
$filesFound++
if ( $RealRun ) {
$lnk.targetPath = $newPath
$lnk.Save()
}
}
if ( $oldArgs -match $lnkRegex ) {
$newArgs = $oldArgs -replace $lnkRegex, $newString
write-host "Found: " $_.fullname -foregroundcolor yellow -backgroundcolor black
write-host "Target: " $oldPath -foregroundcolor yellow -backgroundcolor black
write-host " Replace Args: " $oldArgs
write-host " With Args: " $newArgs
$filesFound++
if ( $RealRun ) {
$lnk.Arguments = $newArgs
$lnk.Save()
}
}
}
if ($filesFound -eq 0) {
write-host "No LNK files found with " $oldString "in target or arguments" -foregroundcolor red -backgroundcolor black
}
else {
if ($RealRun) {
write-host $filesFound "files found and edited" -foregroundcolor red -backgroundcolor black
}
else {
write-host $filesFound "files found" -foregroundcolor green -backgroundcolor black
}
}
Запуск этого скрипта должен успешно измениться.LNK сокращает файлы со следующим в поле Target:
\\contoso\Projects\rhinoexhibit\rhinospecifications.pdf
в
\\city.contoso.com\Departments\AlphaDesignGroup\Projects\rhinoexhibit\rhinospecifications.pdf
и из
"C:\Program Files (x86)\FOXIT READER\Foxit Reader.exe" /A page=37 "\\contoso\Projects\rhinoexhibit\rhinospecifications.pdf"
в
"C:\Program Files (x86)\FOXIT READER\Foxit Reader.exe" /A page=37 "\\city.contoso.com\Departments\AlphaDesignGroup\Projects\rhinoexhibit\rhinospecifications.pdf"