J'ai trouvé un moyen désagréable de faire cela, mais je suis à la recherche d'une procédure PoSh native pour modifier les propriétés d'un fichier .LNK. L’objectif est d’atteindre des ordinateurs distants, de dupliquer un raccourci existant avec la plupart des propriétés correctes et d’en éditer quelques-uns.
S'il était simplement plus facile d'écrire un nouveau fichier de raccourci, cela fonctionnerait aussi.
Copy-Item $sourcepath $destination ## Get the lnk we want to use as a template
$Shell = New-Object -COM WScript.Shell
$shortcut = $Shell.CreateShortcut($destination) ## Open the lnk
$shortcut.TargetPath = "C:\path\to\new\exe.exe" ## Make changes
$shortcut.Description = "Our new link" ## This is the "Comment" field
$shortcut.Save() ## Save
Trouvez la version VB du code ici: http://www.tutorialized.com/view/tutorial/Extract-the-target-file-from-a-shortcut-file-.lnk/18349
Vous trouverez ci-dessous les fonctions que j'utilise pour traiter les fichiers .lnk. Ce sont des versions modifiées des fonctions trouvées ici comme mentionné par @Nathan Hartley. J'ai amélioré Get-Shortcut
pour gérer les caractères génériques comme *
en passant des chaînes à dir
pour les développer en ensembles d'objets FileInfo.
function Get-Shortcut {
param(
$path = $null
)
$obj = New-Object -ComObject WScript.Shell
if ($path -eq $null) {
$pathUser = [System.Environment]::GetFolderPath('StartMenu')
$pathCommon = $obj.SpecialFolders.Item('AllUsersStartMenu')
$path = dir $pathUser, $pathCommon -Filter *.lnk -Recurse
}
if ($path -is [string]) {
$path = dir $path -Filter *.lnk
}
$path | ForEach-Object {
if ($_ -is [string]) {
$_ = dir $_ -Filter *.lnk
}
if ($_) {
$link = $obj.CreateShortcut($_.FullName)
$info = @{}
$info.Hotkey = $link.Hotkey
$info.TargetPath = $link.TargetPath
$info.LinkPath = $link.FullName
$info.Arguments = $link.Arguments
$info.Target = try {Split-Path $info.TargetPath -Leaf } catch { 'n/a'}
$info.Link = try { Split-Path $info.LinkPath -Leaf } catch { 'n/a'}
$info.WindowStyle = $link.WindowStyle
$info.IconLocation = $link.IconLocation
New-Object PSObject -Property $info
}
}
}
function Set-Shortcut {
param(
[Parameter(ValueFromPipelineByPropertyName=$true)]
$LinkPath,
$Hotkey,
$IconLocation,
$Arguments,
$TargetPath
)
begin {
$Shell = New-Object -ComObject WScript.Shell
}
process {
$link = $Shell.CreateShortcut($LinkPath)
$PSCmdlet.MyInvocation.BoundParameters.GetEnumerator() |
Where-Object { $_.key -ne 'LinkPath' } |
ForEach-Object { $link.$($_.key) = $_.value }
$link.Save()
}
}
Je ne pense pas qu'il y ait une manière indigène.
Il existe cet utilitaire DOS: Shortcut.exe .
Vous devez toujours copier l'utilitaire sur le système distant, puis éventuellement l'appeler à l'aide de WMI pour apporter les modifications souhaitées.
Je pense que le moyen le plus simple sera de remplacer et/ou de créer un nouveau fichier.
Avez-vous accès à ces systèmes via un partage distant?
Un petit ajout à la réponse de @ JasonMArcher ..
Pour voir les propriétés disponibles, vous pouvez simplement exécuter $shortcut
après $shortcut = $Shell.CreateShortcut($destination)
dans unPS. Cela affichera toutes les propriétés et leurs valeurs actuelles.