Я хочу использовать powershell, чтобы изменить TargetPath ярлыка для открытия веб-сайта. Я нашел приведенный ниже скрипт, который почти работает
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()
}
}
Однако
Set-Shortcut -LinkPath "C:\Users\user\Desktop\test.lnk" -TargetPath powershell start process "www.youtube.com"
По умолчанию будет добавлен путь по умолчанию, если вы не укажете, что он выглядит так:
"C:\Users\micha\Desktop\powershell start process "www.youtube.com""
как мне избавиться от этого пути к файлу по умолчанию?
БОНУС: Я был бы признателен, если бы кто-нибудь сломал эту строку кода:
ForEach-Object { $link.$($_.key) = $_.value }
Ваш образец вызова не соответствует симптому — это приведет к ошибке. ForEach-Object { $link.$($_.key) = $_.value } устанавливает для каждого переданного параметра (отраженного в автоматической переменной $_) свойство с тем же именем, что и параметр, в значение параметра. Например, -TargetPath powerShell приводит к $link.TargetPath = 'powershell'.





Вы пытались изменить свойства объекта ярлыка напрямую?
Попробуйте это и дайте мне знать:
function Set-Shortcut {
[CmdletBinding()]
param (
[Parameter(Mandatory, Position = 0, ValueFromPipeline)]
[System.String]$FilePath,
[Parameter(Mandatory, Position = 1)]
[System.String]$TargetPath
)
Begin {
$shell = new-object -ComObject WScript.Shell
}
Process {
try {
$file = Get-ChildItem -Path $FilePath -ErrorAction Stop
$shortcut = $shell.CreateShortcut($file.FullName)
$shortcut.TargetPath = $TargetPath
$shortcut.Save()
}
catch {
throw $PSItem
}
}
End {
while ($result -ne -1) {
$result = [System.Runtime.InteropServices.Marshal]::ReleaseComObject($shell)
}
}
вы забыли ОДНУ фигурную скобку, но она сработала отлично, так что вы невероятно признательны
Рад слышать, что это сработало!
Ярлык для открытия веб-сайта — это файл другого формата вместе с расширением .Url. Почему вы хотите запустить PowerShell.exe и открыть сайт в браузере по умолчанию? Это можно сделать, но тогда
TargetPathдолжен быть просто путем к powershell.exe, и все, что вы хотите, чтобы PowerShel делал, идет вArguments.