我发现了一个令人讨厌的VBS方法,但我正在寻找一个原生的PoSh程序来编辑.LNK文件的属性。目标是联系远程计算机,复制具有大多数正确属性的现有快捷方式,并编辑其中的几个。
如果编写新的快捷方式文件会更容易,那也可以。
答案 0 :(得分:30)
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
在这里找到VB版本的代码: http://www.tutorialized.com/view/tutorial/Extract-the-target-file-from-a-shortcut-file-.lnk/18349
答案 1 :(得分:17)
以下是我用来处理.lnk文件的函数。它们是@Nathan Hartley提到的here函数的修改版本。我已经改进Get-Shortcut
来处理像*
这样的通配符,方法是将字符串传递给dir
以将它们扩展为多组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()
}
}
答案 2 :(得分:3)
我认为没有本土方式。
有这个DOS util:Shortcut.exe。
您仍然需要将util复制到远程系统,然后可能使用WMI调用它来进行您正在寻找的更改。
我在想更简单的方法是覆盖和/或创建新文件。
您是否可以通过远程共享访问这些系统?
答案 3 :(得分:0)
@JasonMArcher的答案的简短补充。
要查看可用的属性,您可以在 PS 中的$shortcut
之后运行$shortcut = $shell.CreateShortcut($destination)
。
这将打印所有属性及其当前值。