Powershell: обновление горячих клавиш для ярлыков с помощью powershell не работает - PullRequest
0 голосов
/ 10 октября 2019

На рабочем столе Windows у меня есть папка «Ссылки с одним файлом»: Firefox.lnk

Я вручную установил горячую клавишу «CTRL + SHIFT + F» для этого ярлыка, и все заработало как положено.

Но после перезагрузки моя горячая клавиша "CTRL + SHIFT + F" больше не работает.

Ручная установка горячей клавиши обратно в "", а затем обратно в "CTRL + SHIFT + F" заставляет ее работатьснова.

Но планировалось поместить больше файлов в эту папку - ручное решение не было вариантом - поэтому я планировал установить все горячие клавиши быстрого доступа на пустую строку с помощью сценария powershell, а затем запустить следующий сценарий дляустановите для всех горячих клавиш значение «CTRL + SHIFT + FirstletterOfShortcutFileName».

Первый сценарий устанавливает горячую клавишу обратно на «» (ручная проверка), а после запуска следующего сценария для горячей клавиши ярлыка firefox было установлено значение «CTRL +SHIFT + F». Но, к сожалению, горячая клавиша не работает. Как я могу заставить это работать?

$lnkfiles = Get-ChildItem -Path "C:\Users\xxx\Desktop\Links\" -Filter *.lnk
foreach($lnkfile in $lnkfiles){
    $sh = New-Object -COM WScript.Shell
    $targetPath = $sh.CreateShortcut($lnkfile.FullName)
    $fileName = Split-Path $targetPath.FullName -leaf
    $firstLetter = $fileName[0]
    $targetPath.HotKey = "CTRL+SHIFT+" + $firstLetter
    $targetPath.Save()
}

1 Ответ

1 голос
/ 17 октября 2019

В вашем коде есть несколько проблем, в основном вы устанавливаете свойство HotKey на целевом пути вместо ссылки, а также вы используете метод Save() на целевом пути вместо ссылки.

Это должно делать то, что вы хотите:

$rootPath = 'C:\Users\xxx\Desktop\Links'
$wshShell = New-Object -ComObject WScript.Shell

Get-ChildItem -Path $rootPath -Filter *.lnk | ForEach-Object {
    $shortcut        = $wshShell.CreateShortcut($_.FullName)
    $target          = [System.IO.Path]::GetFileName($shortcut.TargetPath)
    $shortcut.HotKey = 'CTRL+SHIFT+{0}' -f $target.Substring(0,1).ToUpperInvariant()
    $shortcut.Save()
    # cleanup this shortcut COM object after use
    [System.Runtime.Interopservices.Marshal]::ReleaseComObject($shortcut) | Out-Null
}

# clean up the WScript.Shell COM object after use
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($wshShell) | Out-Null
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()

PS Я бы не стал использовать комбинацию клавиш CTRL + SHIFT + .., потому что слишком много горячих клавиш по умолчанию в Windows используют это. Возможно, лучше сделать что-нибудь с CTRL + ALT + ..

...