PowerShell - Массовая замена свойств ярлыков

imageВ некоторых ситуациях может потребоваться массовая замена свойств ярлыков. Например в каком-то сетевом каталоге расположено множество ярлыков разгруппированных по подкаталогам и какая-то часть этих ярлыков ссылается на некоторое приложение которое было перемещено в новое месторасположение. В нашем случае имеется несколько серверов RDS в ферме RD Connection Broker с перемещаемыми профилями пользователей, и пользователям со всех серверов RDS доступна общая сетевая папка с ярлыками, ссылающимися на кучу разных мелких бизнес-приложений (АРМ). Большая часть ярлыков ссылается на приложения App-V, для которых после перехода с версии App-V 4.6 на версию App-V 5.0 потребовалось изменить свойства этих ярлыков. Такая ситуация потребует от нас, как минимум, замену таких свойств ярлыков, как ссылка на объект запуска, рабочая папка и иконка приложения.

Ниже простой пример того, как можно с помощью PowerShell рекурсивно найти все *.lnk файлы в определённом каталоге и выполнить замену их старых свойств на новые:

# Пример работы с атрибутами ярлыка здесь: http://msdn.microsoft.com/en-us/library/xsy6k3ys(v=vs.84).aspx
#
# $ShortcutsDir - Корневой каталог поиска и замены
# $OldTargetPath - Старый путь запуска приложения из свойств ярлыков (с аргументами, если они есть)
# $NewWorkingDir - Новый каталог запуска приложения (он же определён как рабочая папка)
# $NewTargetPath - Новое имя исполняемого файла (с учетом новой рабочей папки)
# $NewDescription - Описание ярлыка (всплывающая подсказка)
# $NewIconLocation - Иконка ярлыка (по умолчанию используется иконка из исполняемого файла с индексом 0)
#
$ShortcutsDir = "\\holding.com\Services\RDSNLB_SharedLNK\ARM"
$OldTargetPath = '"C:\Program Files (x86)\Microsoft Application Virtualization Client\sfttray.exe" /launch "IS_Client 4.11.11"'
$NewWorkingDir = "%ALLUSERSPROFILE%\Microsoft\AppV\Client\Integration\5F02F554-B167-41C6-98DB-D35F494AA506\Root\"
$NewTargetPath = $NewWorkingDir + "isc_net.exe"
$NewDescription = "Запустить Инфострим Клиент"
$NewIconLocation = $NewTargetPath + ", 0"


$Shortcuts = Get-ChildItem -Recurse $ShortcutsDir -Include *.lnk
Write-Host "Всего найдено ярлыков:" $Shortcuts.Count -ForegroundColor Green
$Changed = 0
ForEach ($Shortcut in $Shortcuts) {

    $ShortcutObj =$null
    $Destination = $Shortcut.FullName
    $Shell = New-Object -COM WScript.Shell
    $ShortcutObj = $Shell.CreateShortcut($Destination)
       
    $OldTardet = $ShortcutObj.TargetPath
    $OldArgums = $ShortcutObj.Arguments
    $OldFPath =  '"'+$OldTardet + '" ' + $OldArgums

    If ($OldFPath -eq $OldTargetPath) {
        Write-Host "Меняем свойства ярлыка:" $Destination
        $ShortcutObj.TargetPath =  $NewTargetPath
        $ShortcutObj.Arguments = ""
        $ShortcutObj.WorkingDirectory = $NewWorkingDir
        $ShortcutObj.Description = $NewDescription
        $ShortcutObj.IconLocation = $NewIconLocation
        $ShortcutObj.Save()
        $Changed = $Changed + 1
    }

}
Write-Host "Изменено ярлыков:" $Changed -ForegroundColor Green

Всего комментариев: 3 Комментировать

  1. sanpai /

    Не хочет менять(
    Ярлыки видит, но пути и наименование файла не меняет. Нужны ли права админа?

  2. sanpai /

    Разобрался - шла сверка старого пути И аргументов. Удалил проверку аргументов(мне не требуется), все заработало - СПС.

    Корректировал в строке:
    $OldFPath = '"'+$OldTardet + '" ' + $OldArgums
    Стало:
    $OldFPath = $OldTardet

  3. misha /

    а как изменить только часть пути? у меня очень много разных ярлыков, а изменилась только первая часть пути. Как быть ?

Добавить комментарий