Изменить ярлык цели навалом?
У меня есть сотни ссылок на сайты, где цель выглядит так:
C: \ Users \ Herb \ AppData \ Local \ Google \ Chrome \ Application \ chrome.exe www.somesite.com/foo
Я только что обновился до Windows 8, и исполняемый файл Chrome теперь хранится в Program Files; поэтому, чтобы эти ярлыки работали, я должен изменить их так:
"C: \ Program Files (x86) \ Google \ Chrome \ Application \ chrome.exe" www.somesite.com/foo
Есть ли способ, которым я могу автоматизировать это изменение? Я программист, но с Windows-сценариями мало что сделал.
5 ответов
Недавно я обнаружил, что у меня похожая проблема, и решил внести изменения в сценарии, как первоначально требовалось. Возможно, кто-то найдет это полезным. Это сценарий PowerShell, основанный на ранее упомянутой ссылке, но с некоторыми улучшениями (он запускается только по начальному пути, изменяет существующую ссылку вместо удаления / создания, имеет режим пробного запуска и т. Д.).
Я не особенно осведомлен, когда дело доходит до PowerShell, поэтому я приветствую любые предложения по улучшению:
$oldPrefix = "\\OldServer\Archive\"
$newPrefix = "\\NewServer\Archive\"
$searchPath = "Z:\"
$dryRun = $TRUE
$shell = new-object -com wscript.shell
if ( $dryRun ) {
write-host "Executing dry run" -foregroundcolor green -backgroundcolor black
} else {
write-host "Executing real run" -foregroundcolor red -backgroundcolor black
}
dir $searchPath -filter *.lnk -recurse | foreach {
$lnk = $shell.createShortcut( $_.fullname )
$oldPath= $lnk.targetPath
$lnkRegex = "^" + [regex]::escape( $oldPrefix )
if ( $oldPath -match $lnkRegex ) {
$newPath = $oldPath -replace $lnkRegex, $newPrefix
write-host "Found: " + $_.fullname -foregroundcolor yellow -backgroundcolor black
write-host " Replace: " + $oldPath
write-host " With: " + $newPath
if ( !$dryRun ) {
$lnk.targetPath = $newPath
$lnk.Save()
}
}
}
Делать
C:\Users\Herb\AppData\Local\Google
каталог соединения, который указывает на
C:\Program Files (x86)\Google
используя Mklink, проблема решена.
У меня есть сумасшедшие сетевые администраторы, которые всегда меняют 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 со следующими параметрами в поле "Цель":
\\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"
Для тех, кому удобнее использовать программу.exe вместо скрипта:
"Поиск и замена ярлыков" может заменить все неисправные ярлыки в указанной папке одним щелчком мыши.
Я сделал скрипт AutoIt для этого:
Заменит все подстроки, указанные указанной вами подстановочной подстрокой во всех полях Target и WorkingDir LNK, указанных в указанном вами каталоге. Также имеется имитированный режим, чтобы показать вам результаты вашей замены в текстовом файле, чтобы вы могли увидеть, что найдено и какая целевая подстрока LNK соответствует вам.
https://www.autoitscript.com/forum/topic/181812-lnksubstringreplacer-link-lnk-path-substring-replacer/ - LNKSubstringReplacer Link LNK Path Substring Replacer
Это должно быть возможно с PowerShell в Windows 8. Я нашел некоторую информацию здесь и здесь. Я не эксперт PowerShell, но, как вы программист, я уверен, что вы могли бы найти способ (и, возможно, опубликуйте его как ответ здесь, чтобы другие могли его увидеть).