Изменить ярлык цели навалом?

У меня есть сотни ссылок на сайты, где цель выглядит так:

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, мне пришлось выяснить, как его использовать, поэтому я дам пошаговые инструкции о том, как использовать мою модификацию его превосходного сценария:

  1. Используя Блокнот, вставьте приведенный ниже код в новый текстовый документ. Сохраните документ как Edit-LNK-files.ps1 в каталог, который легко найти и быстро набрать (например, C:\MyPowerShells)
  2. В Блокноте отредактируйте $oldString Параметр (строка 4) содержит строку, которую вы хотите найти, и $newString Параметр (строка 7) содержит строку, которую вы хотите заменить. Изменить $searchPath параметр (строка 10), чтобы указать каталог, в котором находятся ваши файлы.LNK для редактирования.Кроме того, вы можете указать эти переменные позже по своему усмотрению, запустив скрипт из командной строки PowerShell и отредактировав параметры (т.е. & "C:\MyPowerShells\Edit-LNK-files.ps1" -oldString E:\ -newString D:\ -searchPath "C:\My LNKs\"
  3. Запустите Windows Powershell от имени администратора: Пуск> Все программы> Стандартные> Windows PowerShell, щелкните правой кнопкой мыши Windows PowerShell и выберите Запуск от имени администратора.
  4. В Powershell введите set-executionpolicy remotesigned и нажмите Enter
  5. Тип Y и нажмите Enter, чтобы разрешить PowerShell запускать сценарий, который вы только что создали в Блокноте (вы можете захотеть изменить его после того, как закончите, чтобы обеспечить безопасность вашей системы).
  6. Тип & "C:\MyPowerShells\Edit-LNK-files.ps1"
  7. Нажмите Enter, чтобы выполнить "Dry Run" (отличная идея, Терренс! Но я изменил это на значение по умолчанию)
  8. Просмотрите вывод "Пробного прогона" - пути изменились соответствующим образом? Если нет, измените $newString а также $oldString переменные, затем повторите шаги 6-8, чтобы повторить пробный прогон. В противном случае перейдите к шагу 9.
  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, но, как вы программист, я уверен, что вы могли бы найти способ (и, возможно, опубликуйте его как ответ здесь, чтобы другие могли его увидеть).

Другие вопросы по тегам