Powershell: обновление горячих клавиш для ярлыков через powershell не работает

На рабочем столе Windows у меня есть папка Links с одним файлом: 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()
}

person Porsche9II    schedule 10.10.2019    source источник
comment
Я бы сказал, что .HotKey работает только для ярлыков на вашем рабочем столе (не работает в подпапках на рабочем столе).   -  person JosefZ    schedule 11.10.2019
comment
Горячие клавиши работают при добавлении вручную - даже во вложенной папке.   -  person Porsche9II    schedule 12.10.2019
comment
Работают ли добавленные вручную горячие клавиши в подпапке даже после перезагрузки компьютера?   -  person JosefZ    schedule 12.10.2019
comment
Нет - просто переместил ярлык на рабочий стол и после перезагрузки горячая клавиша не работает   -  person Porsche9II    schedule 12.10.2019


Ответы (1)


В вашем коде есть несколько ошибок, в основном вы устанавливаете свойство 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()

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

person Theo    schedule 17.10.2019
comment
Ваш P.S. есть решение - теперь все работает! Вручную я всегда набирал CTRL+ALT, но в моем коде это было CTRL+SHIFT — оооочень глупо - person Porsche9II; 17.10.2019