5

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

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-сценариями мало что сделал.

4 ответа4

9

Недавно я обнаружил, что у меня похожая проблема, и решил внести изменения в сценарии, как первоначально требовалось. Возможно, кто-то еще найдет это полезным. Это сценарий 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()
      }
   }
}
3

У меня есть сумасшедшие сетевые администраторы, которые всегда меняют 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 сокращает файлы со следующим в поле 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"
3

Делать

C:\Users\Herb\AppData\Local\Google

каталог соединения, который указывает на

C:\Program Files (x86)\Google

используя Mklink, проблема решена.

-1

Это должно быть возможно с PowerShell в Windows 8. Я нашел некоторую информацию здесь и здесь. Я не эксперт PowerShell, но, как вы программист, я уверен, что вы могли бы найти способ (и, возможно, опубликуйте его как ответ здесь, чтобы другие могли его увидеть).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .