Войти

Показать полную графическую версию : [решено] Закрепление ярлыков в меню "Пуск" в ХР


TERMINAL
04-05-2012, 10:10
Добрый день !
Есть статья Закрепление ярлыков в меню "Пуск" (http://www.oszone.net/6166) и статья Hey, Scripting Guy! Can I Pin a File to the Start Menu by Using a Script? (http://blogs.technet.com/b/heyscriptingguy/archive/2004/11/11/can-i-pin-a-file-to-the-start-menu-by-using-a-script.aspx).
Возможно ли, более подходящую вторую статью, сделать так в AutoIt ?

Iska
04-05-2012, 10:38
TERMINAL, в аккурат по этой самой статье Hey, Scripting Guy! Can I Pin a File to the Start Menu by Using a Script? (http://blogs.technet.com/b/heyscriptingguy/archive/2004/11/11/can-i-pin-a-file-to-the-start-menu-by-using-a-script.aspx) делаете на AutoIt (я, правда, предпочитаю прикреплять не сами исполняемые файлы, а ярлыки из Главного меню).

Какие проблемы с переводом с WSH на AutoIt?

TERMINAL
04-05-2012, 15:38
Какие проблемы с переводом с WSH на AutoIt? »
Угадали, и хотелось бы конечно тоже ярлыки создавать...

Iska
04-05-2012, 16:05
Угадали »
Что угадал? Я спросил — «какие проблемы?», а Вы отвечаете — «угадал»?!

TERMINAL
05-05-2012, 09:36
Iska, проблема с переводом с WSH на AutoIt.

Iska
05-05-2012, 13:19
WSH:
Option Explicit

Dim objShell
Dim objFolder
Dim objFolderItem
Dim objVerb

Set objShell = WScript.CreateObject("Shell.Application")
Set objFolder = objShell.Namespace("shell:Start Menu")

If Not objFolder Is Nothing Then
Set objFolderItem = objFolder.ParseName("Программы")

If Not objFolderItem Is Nothing Then
If objFolderItem.IsFolder Then
Set objFolder = objFolderItem.GetFolder

If Not objFolder Is Nothing Then
Set objFolderItem = objFolder.ParseName("Internet Explorer.lnk")

If Not objFolderItem Is Nothing Then
For Each objVerb In objFolderItem.Verbs
' &Закрепить в меню "Пуск"
' &Изъять из меню "Пуск"

If objVerb.Name = "&Закрепить в меню ""Пуск""" Then
objVerb.DoIt()
End If
Next
Else
WScript.Echo "Can't parse name [Internet Explorer.lnk]"
End If
Else
WScript.Echo "Can't get folder from item [Программы]"
End If
Else
WScript.Echo "Folder item [Программы] is not a folder"
End If
Else
WScript.Echo "Can't parse name [Программы]"
End If
Else
WScript.Echo "Can't get folder [Start Menu]"
End If

WScript.Quit 0


AutoIt:
AutoItSetOption("MustDeclareVars", 1)

Local $oShell = ObjCreate("Shell.Application")
Local $oFolder = $oShell.Namespace("shell:Start Menu")
Local $oFolderItem
Local $oVerb

If Not ObjName($oFolder) = "" Then
$oFolderItem = $oFolder.ParseName("Программы")

If Not ObjName($oFolderItem) = "" Then
If $oFolderItem.IsFolder Then
$oFolder = $oFolderItem.GetFolder

If Not ObjName($oFolder) = "" Then
$oFolderItem = $oFolder.ParseName("Internet Explorer.lnk")

If Not ObjName($oFolderItem) = "" Then
For $oVerb In $oFolderItem.Verbs
; &Закрепить в меню "Пуск"
; &Изъять из меню "Пуск"

If $oVerb.Name = "&Закрепить в меню ""Пуск""" Then
$oVerb.DoIt()
EndIf
Next
Else
ConsoleWriteError("Can't parse name [Internet Explorer.lnk]" & @CRLF)
EndIf
Else
ConsoleWriteError("Can't get folder from item [Программы]" & @CRLF)
EndIf
Else
ConsoleWriteError("Folder item [Программы] is not a folder" & @CRLF)
EndIf
Else
ConsoleWriteError("Can't parse name [Программы]" & @CRLF)
EndIf
Else
ConsoleWriteError("Can't get folder [Start Menu]" & @CRLF)
EndIf

Exit(0)

Полагаю, что на основе этого будет понятнее.

TERMINAL
05-05-2012, 17:10
Iska, А обновить сразу можно меню ПУСК, чтобы увидеть изменения?

Iska
05-05-2012, 18:44
TERMINAL, я под Windows XP вижу изменения сразу — мы ведь работаем с самим Проводником.

TERMINAL
05-05-2012, 18:58
Iska, Ничего не происходит и ошибки не выдаёт-вроде всё правильно, я так понял поиск идёт по самому ПУСК=Все программы?
AutoItSetOption("MustDeclareVars", 1)

Local $oShell = ObjCreate("Shell.Application")
Local $oFolder = $oShell.Namespace("shell:Start Menu")
Local $oFolderItem
Local $oVerb

If Not ObjName($oFolder) = "" Then
$oFolderItem = $oFolder.ParseName("Программы")

If Not ObjName($oFolderItem) = "" Then
If $oFolderItem.IsFolder Then
$oFolder = $oFolderItem.GetFolder

If Not ObjName($oFolder) = "" Then
$oFolderItem = $oFolder.ParseName("Skype 5.lnk")

If Not ObjName($oFolderItem) = "" Then
For $oVerb In $oFolderItem.Verbs
; &Закрепить в меню "Пуск"
; &Изъять из меню "Пуск"

If $oVerb.Name = '&Закрепить в меню ""Пуск""' Then
$oVerb.DoIt()
EndIf
Next
Else
ConsoleWriteError("Can't parse name [D:\Program Files\Skype\Phone\Skype.exe]" & @CRLF)
EndIf
Else
ConsoleWriteError("Can't get folder from item [Программы]" & @CRLF)
EndIf
Else
ConsoleWriteError("Folder item [Программы] is not a folder" & @CRLF)
EndIf
Else
ConsoleWriteError("Can't parse name [Программы]" & @CRLF)
EndIf
Else
ConsoleWriteError("Can't get folder [Start Menu]" & @CRLF)
EndIf

Exit(0)

Iska
05-05-2012, 20:09
TERMINAL, скомпилируйте скрипт для консоли (как CUI) и запустите скомпилированный код непосредственно из командной строки. Если будут ошибки — Вы их увидите. Либо просто сделайте перенаправление потока ошибок в файл:
"<скомпилированный код>.exe" 2>errors.txt
и посмотрите на его содержимое.

я так понял поиск идёт по самому ПУСК=Все программы? »
Нет. Мы спускаемся по дереву Проводника: «C:\Documents and Settings\UserName\Главное меню» [это "shell:Start Menu"] → «Программы» → «Internet Explorer.lnk». Сия структура справедлива для Windows XP.

TERMINAL
05-05-2012, 20:13
TERMINAL, скомпилируйте скрипт для консоли (как CUI) и запустите скомпилированный код непосредственно из командной строки. Если будут ошибки — Вы их увидите. »
Да за это я вкурсе, мне в консоле пишет
>"D:\Program Files\AutoIt3\SciTE\AutoIt3Wrapper\AutoIt3Wrapper.exe" /run /prod /ErrorStdOut /in "C:\tets.au3" /autoit3dir "D:\Program Files\AutoIt3" /UserParams
+>19:10:52 Starting AutoIt3Wrapper v.2.0.1.24 Environment(Language:0419 Keyboard:00000409 OS:WIN_XP/Service Pack 3 CPU:X64 OS:X86)
>Running AU3Check (1.54.19.0) from:D:\Program Files\AutoIt3
+>19:10:52 AU3Check ended.rc:0
>Running:(3.3.6.1):D:\Program Files\AutoIt3\autoit3.exe "C:\tets.au3"
+>19:10:55 AutoIT3.exe ended.rc:0
и ничего не добовляется. В C:\Documents and Settings\UserName\Главное меню должен тоже ярлык лежать на этот файл или ехе должен быть?

Iska
05-05-2012, 22:12
Получается, что не в курсе.

Ладно. Замените все «ConsoleWriteError()» на «MsgBox()».

TERMINAL
07-05-2012, 09:20
Получается, что не в курсе.
Ладно. Замените все «ConsoleWriteError()» на «MsgBox()». »
Да разницы то никакой, то в консоли выводит, а то сообщением....Для эксперемента заменил на MsgBox()-всеравно тишина, без ошибок и ничего не появляется...

Iska
07-05-2012, 10:28
TERMINAL, сожалею, у меня нет идей. Ждите более опытных коллег.

_syd_
15-07-2012, 00:40
TERMINAL, поищите файл Skype.lnk в папке с профилями пользователей, скорее всего найдёте его в профиле "All Users", то бишь правильный вариант в данном случае будет несколько иной. Проверено на [addon] Skype 5.10.32.114 Business Edition (http://forum.oszone.net/thread-205267.html)

TERMINAL
16-07-2012, 19:00
_syd_, вроде бы работает, а вот можно закрепить с другим именем как я хочу, например на русском языке-Скайп ?

SharkyEXE
07-09-2015, 05:26
Всем здравствуйте.

Моя ОС: MS Windows 7 SP1 Pro x64 Rus

1) Здесь (http://forum.oszone.net/post-1910952-6.html) есть код AutoitAutoItSetOption("MustDeclareVars", 1)

Local $oShell = ObjCreate("Shell.Application")
Local $oFolder = $oShell.Namespace("shell:Start Menu")
Local $oFolderItem
Local $oVerb

If Not ObjName($oFolder) = "" Then
$oFolderItem = $oFolder.ParseName("Программы")

If Not ObjName($oFolderItem) = "" Then
If $oFolderItem.IsFolder Then
$oFolder = $oFolderItem.GetFolder

If Not ObjName($oFolder) = "" Then
$oFolderItem = $oFolder.ParseName("Internet Explorer.lnk")

If Not ObjName($oFolderItem) = "" Then
For $oVerb In $oFolderItem.Verbs
; &Закрепить в меню "Пуск"
; &Изъять из меню "Пуск"

If $oVerb.Name = "&Закрепить в меню ""Пуск""" Then
$oVerb.DoIt()
EndIf
Next
Else
ConsoleWriteError("Can't parse name [Internet Explorer.lnk]" & @CRLF)
EndIf
Else
ConsoleWriteError("Can't get folder from item [Программы]" & @CRLF)
EndIf
Else
ConsoleWriteError("Folder item [Программы] is not a folder" & @CRLF)
EndIf
Else
ConsoleWriteError("Can't parse name [Программы]" & @CRLF)
EndIf
Else
ConsoleWriteError("Can't get folder [Start Menu]" & @CRLF)
EndIf

Exit(0)
2) Создал пустой файл C:\1.au3

3) В файл C:\1.au3 вставил целиком/полностью код AutoItAutoItSetOption("MustDeclareVars", 1)

Local $oShell = ObjCreate("Shell.Application")
Local $oFolder = $oShell.Namespace("shell:Start Menu")
Local $oFolderItem
Local $oVerb

If Not ObjName($oFolder) = "" Then
$oFolderItem = $oFolder.ParseName("Программы")

If Not ObjName($oFolderItem) = "" Then
If $oFolderItem.IsFolder Then
$oFolder = $oFolderItem.GetFolder

If Not ObjName($oFolder) = "" Then
$oFolderItem = $oFolder.ParseName("Internet Explorer.lnk")

If Not ObjName($oFolderItem) = "" Then
For $oVerb In $oFolderItem.Verbs
; &Закрепить в меню "Пуск"
; &Изъять из меню "Пуск"

If $oVerb.Name = "&Закрепить в меню ""Пуск""" Then
$oVerb.DoIt()
EndIf
Next
Else
ConsoleWriteError("Can't parse name [Internet Explorer.lnk]" & @CRLF)
EndIf
Else
ConsoleWriteError("Can't get folder from item [Программы]" & @CRLF)
EndIf
Else
ConsoleWriteError("Folder item [Программы] is not a folder" & @CRLF)
EndIf
Else
ConsoleWriteError("Can't parse name [Программы]" & @CRLF)
EndIf
Else
ConsoleWriteError("Can't get folder [Start Menu]" & @CRLF)
EndIf

Exit(0)
4) В файле C:\1.au3 заменил только Internet Explorer.lnk на Блокнот.lnk

5) Получилось такAutoItSetOption("MustDeclareVars", 1)

Local $oShell = ObjCreate("Shell.Application")
Local $oFolder = $oShell.Namespace("shell:Start Menu")
Local $oFolderItem
Local $oVerb

If Not ObjName($oFolder) = "" Then
$oFolderItem = $oFolder.ParseName("Программы")

If Not ObjName($oFolderItem) = "" Then
If $oFolderItem.IsFolder Then
$oFolder = $oFolderItem.GetFolder

If Not ObjName($oFolder) = "" Then
$oFolderItem = $oFolder.ParseName("Блокнот.lnk")

If Not ObjName($oFolderItem) = "" Then
For $oVerb In $oFolderItem.Verbs
; &Закрепить в меню "Пуск"
; &Изъять из меню "Пуск"

If $oVerb.Name = "&Закрепить в меню ""Пуск""" Then
$oVerb.DoIt()
EndIf
Next
Else
ConsoleWriteError("Can't parse name [Блокнот.lnk]" & @CRLF)
EndIf
Else
ConsoleWriteError("Can't get folder from item [Программы]" & @CRLF)
EndIf
Else
ConsoleWriteError("Folder item [Программы] is not a folder" & @CRLF)
EndIf
Else
ConsoleWriteError("Can't parse name [Программы]" & @CRLF)
EndIf
Else
ConsoleWriteError("Can't get folder [Start Menu]" & @CRLF)
EndIf

Exit(0)
6) Скомпилировал файл C:\1.au3 в exe, получился файл C:\1.exe

7) Запускаю файл C:\1.exe

8. Перезагрузил ПК

9) Нажимаю кнопку "Пуск", строки Блокнот нету

10) Файл-ярлык Блокнот.lnk, который надо закрепить в меню "Пуск", у меня находится в папке: C:\Users\-\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Accessories

Что я сделал не так, пожалуйста, помогите мне.

SharkyEXE
07-09-2015, 18:53
Пожалуйста, сделайте в этом (http://forum.oszone.net/post-1910952-6.html) коде - чтобы прописать путь к файлу-ярлыку:
1) прописал путь C:\Users\-\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Accessories\Блокнот.lnk
2) скомпилировал в exe файл скрипт au3
3) запустил exe файл
4) в меню "Пуск" закреплен файл-ярлык Блокнот

-TRM-
14-10-2015, 11:44
SharkyEXE, FileCreateShortcut(@WindowsDir & "\NOTEPAD.EXE", @ProgramsCommonDir & "\Блокнотик.lnk", @WindowsDir, "", "Это блокнот", "", "", @SW_MINIMIZE)




© OSzone.net 2001-2012