В некоторых ситуациях может потребоваться массовая замена свойств ярлыков. Например в каком-то сетевом каталоге расположено множество ярлыков разгруппированных по подкаталогам и какая-то часть этих ярлыков ссылается на некоторое приложение которое было перемещено в новое месторасположение. В нашем случае имеется несколько серверов 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
Не хочет менять(
Ярлыки видит, но пути и наименование файла не меняет. Нужны ли права админа?
Разобрался - шла сверка старого пути И аргументов. Удалил проверку аргументов(мне не требуется), все заработало - СПС.
Корректировал в строке:
$OldFPath = '"'+$OldTardet + '" ' + $OldArgums
Стало:
$OldFPath = $OldTardet
а как изменить только часть пути? у меня очень много разных ярлыков, а изменилась только первая часть пути. Как быть ?