1

Тема: VBS: Подправить скрипт для создания ярлыка на панели задач

Есть такой скрипт


' origin: https://stackoverflow.com/questions/31720595/pin-program-to-taskbar-using-ps-in-windows-10


If WScript.Arguments.Count < 1 Then WScript.Quit
'----------------------------------------------------------------------
Set objFSO = CreateObject("Scripting.FileSystemObject")
objFile    = WScript.Arguments.Item(0)
sKey1      = "HKCU\Software\Classes\*\shell\{:}\\"
sKey2      = Replace(sKey1, "\\", "\ExplorerCommandHandler")
'----------------------------------------------------------------------
With WScript.CreateObject("WScript.Shell")
    KeyValue = .RegRead("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer" & _
        "\CommandStore\shell\Windows.taskbarpin\ExplorerCommandHandler")

    .RegWrite sKey2, KeyValue, "REG_SZ"

    With WScript.CreateObject("Shell.Application")
        With .Namespace(objFSO.GetParentFolderName(objFile))
            With .ParseName(objFSO.GetFileName(objFile))
                .InvokeVerb("{:}")
            End With
        End With
    End With

    .Run("Reg.exe delete """ & Replace(sKey1, "\\", "") & """ /F"), 0, True
End With
'----------------------------------------------------------------------

Я запускаю его из стороннего приложения, передаю аргументом - путь к lnk-файлу, который хочу прикрепить к панели задач.
Скрипт хорошо работает.
Единственный минус - в свойствах получившегося ярлыка не заполнено поле "Рабочая папка".
А без этого запускаемая программа некорректно работает.
Исправить ее не получится (third party app).

Как в этом скрипте записать еще и рабочую папку?
https://i.imgur.com/3Tu1x5l.png

Если технология не освобождает людей от рутины, тогда весь технический прогресс бессмысленен.
© Жак Фреско

2

Re: VBS: Подправить скрипт для создания ярлыка на панели задач

user7256

Вроде, можно так (пример взят из Automation.chm - пока некогда писать и проверять код):

Set objShellApp = CreateObject("Shell.Application")
Set objFolder=objShellApp.NameSpace("C:\").ParentFolder.ParentFolder 'рабочий стол
Set objFolderItem = objFolder.ParseName("Paint.lnk")
Set objSLO = objFolderItem.GetLink
MsgBox objSLO.WorkingDirectory
objSLO.WorkingDirectory = "C:\"
objSLO.Save
MsgBox objSLO.WorkingDirectory

3

Re: VBS: Подправить скрипт для создания ярлыка на панели задач

Что-то пока не получается.
Не могу понять, как это впихнуть в многоуровневый With.

Если технология не освобождает людей от рутины, тогда весь технический прогресс бессмысленен.
© Жак Фреско

4

Re: VBS: Подправить скрипт для создания ярлыка на панели задач

user7256
Мне не хочется экспериментировать с модификацией реестра на своём компьютере, поэтому попробую чисто теоретически предложить:

    
    With WScript.CreateObject("Shell.Application")
        With .Namespace(objFSO.GetParentFolderName(objFile))
            With .ParseName(objFSO.GetFileName(objFile))
                .InvokeVerb("{:}")
'''
                With .GetLink
                    .WorkingDirectory = objFSO.GetParentFolderName(objFile) ' или какая должна быть рабочая папка?
                    .Save
                End With
'''
            End With
        End With
    End With

5

Re: VBS: Подправить скрипт для создания ярлыка на панели задач

Этот вариант не сработал.
Но я понял, что я сам ошибся.
Решил свою проблему, установив Рабочую папку в свойствах изначального lnk-файла.
Если не было прописано там, то и на панели задач не будет прописано.
Мой lnk-файл создавался в другом скрипте, а там можно выстановить эту рабочую папку.

Вам отдельное спасибо за желание помочь и плюс в карму.

Если технология не освобождает людей от рутины, тогда весь технический прогресс бессмысленен.
© Жак Фреско

6

Re: VBS: Подправить скрипт для создания ярлыка на панели задач

user7256, день добрый.

Я бы предложил заменить конструкцию с With


    With WScript.CreateObject("Shell.Application")
        With .Namespace(objFSO.GetParentFolderName(objFile))
            With .ParseName(objFSO.GetFileName(objFile))
                .InvokeVerb("{:}")
            End With
        End With
    End With

на

CreateObject("Shell.Application") _
	.Namespace(objFSO.GetParentFolderName(objFile)) _
	.ParseName(objFSO.GetFileName(objFile)) _
	.InvokeVerb("{:}")

With нужен только если в выделенных местах необходимо множественное обращение к свойствам и методам исходного объекта на текущем уровне вложенности:

With WScript.CreateObject("Shell.Application")
---->
        With .Namespace(objFSO.GetParentFolderName(objFile))
---->
            With .ParseName(objFSO.GetFileName(objFile))
                .InvokeVerb("{:}")
            End With
---->
        End With
---->
    End With

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !