Войти

Показать полную графическую версию : Создать ярлык, добавить в автозагрузку


Полина_Комиссарова@vk
28-07-2017, 23:18
Вопрос может и слишком нубский, но все же.
Есть ТЕСТОВЫЙ вбсник суть которого состоит в том, чтобы создать ярлык(ярлык себя же - это только для примера) и добавить себя в автозагрузку при этом проверяя наличие ярлыка.
Set fso = CreateObject("Scripting.FileSystemObject")

if fso.FileExists(FSO.GetBaseName(WScript.ScriptName) & ".lnk") then 'проверка наличия .lnk
wscript.echo "yes"
else
wscript.echo "no, add" 'создание .lnk
Set st = CreateObject("WScript.Shell")
j = FSO.GetBaseName(WScript.ScriptName) 'Название ярлыка
c = ".lnk" 'Описание Ярлыка
h = WScript.ScriptFullName 'Суть к файлу для которого создается ярлык
e = "14" 'Номер иконки ярлыка
Set f = st.CreateShortcut(j & ".lnk")
f.Description = c
f.IconLocation = "shell32.dll," & e
f.TargetPath = h
f.save()
end if
CreateObject("WScript.Shell").RegWrite "HKCU\Software\Microsoft\Windows\CurrentVersion\Run\Window", WScript.ScriptFullName

Проблема состоит в том , что при запуске ПК ярлык вбс проверяет и создает файл не в своей папке (из которой был произведен запуск) а в "C:\Windows\System32\"
Где в коде ошибка?
И можно ли указать путь сохранения ярлыка?

Iska
29-07-2017, 00:28
при запуске ПК ярлык вбс проверяет и создает файл не в своей папке (из которой был произведен запуск) а в "C:\Windows\System32\" »
Как производится вызов скрипта на исполнение?

Полина_Комиссарова@vk
29-07-2017, 12:56
Как производится вызов скрипта на исполнение? »
После перезагрузки ПК скрипт запускается из рееста
CreateObject("WScript.Shell").RegWrite "HKCU\Software\Microsoft\Windows\CurrentVersion\Run\Window", WScript.ScriptFullName »

Iska
29-07-2017, 20:06
Полина_Комиссарова@vk, определитесь. Выше Вы пишете про ярлык, ниже пишете про реестр. Что, за чем, куда — я уже толком перестал понимать.

Полина_Комиссарова@vk
29-07-2017, 20:13
определитесь. Выше Вы пишете про ярлык, ниже пишете про реестр. Что, за чем, куда — я уже толком перестал понимать. »
Запускаю файл вручную- все отлично , ярлык создался где надо и добавляет себя в реестр
CreateObject("WScript.Shell").RegWrite "HKCU\Software\Microsoft\Windows\CurrentVersion\Run\Window", WScript.ScriptFullName »
после перезагрузки ПК файл загружается из автозагрузки и пытается создать файл в "C:\Windows\System32\" а не в папке где сам находится(как мне надо)

mwz
29-07-2017, 23:28
и пытается создать файл в "C:\Windows\System32\" а не в папке где сам находится(как мне надо) »

А где вы в скрипте сказали, что надо в его папке создавать файл??
Не надо путать папку, из которой запускается программа (или скрипт), с её рабочей папкой, которая в общем случае не совпадает с папкой запуска.

Полина_Комиссарова@vk
29-07-2017, 23:51
И можно ли указать путь сохранения ярлыка? »
А где вы в скрипте сказали, что надо в его папке создавать файл?? »

Iska
30-07-2017, 05:52
Полина_Комиссарова@vk, как уже выше отметил коллега mwz, дело в том, что Вы совершаете распространённую ошибку, полагая, что текущий каталог всегда будет равен каталогу, где расположен исполняемый файл, скрипт, пакетный файл, документ и т.п. В ряде случаев они могут и совпадать:
Запускаю файл вручную- все отлично , ярлык создался где надо »
В общем же случае надо помнить, что это совсем не так, и сие надо учитывать.

В Вашем частном случае всё строится именно на таком рассчёте:
If objFSO.FileExists(objFSO.GetBaseName(WScript.ScriptName) & ".lnk") …
— проверяется существование файла ярлыка в текущем для исполняемого скрипта каталоге. Когда скрипт запускается Вами «ручками» — текущим каталогом будет каталог скрипта. Когда скрипт запускается из:
HKCU\Software\Microsoft\Windows\CurrentVersion\Run
— текущим каталогом будет каталог исполняемого файла wscript.exe. Посему указанный код не найдёт там ранее созданного ярлыка и начнёт его создавать. Разумеется, там же — в %SystemRoot%\System32, поскольку и ниже по коду тот же самый рассчёт:
j = FSO.GetBaseName(WScript.ScriptName) 'Название ярлыка

Set f = st.CreateShortcut(j & ".lnk")

Чтобы этого не происходило, надо указывать полные пути.

Опишите Вашу задачу.

mwz
30-07-2017, 09:44
Iska, насколько я понял, в данной [частной] задаче надо создавать этот ярлык именно в той папке, где расположен сам скрипт.
И тогда надо указывать полный путь не в явном виде, а так, как в батниках делается использованием префикса %~dp0.

Iska
30-07-2017, 09:59
Iska, насколько я понял, в данной [частной] задаче надо создавать этот ярлык именно в той папке, где расположен сам скрипт. »
Вот мне бы хотелось послушать про саму задачу.

И тогда надо указывать полный путь не в явном виде, а так, как в батниках делается использованием префикса %~dp0, т.е. созданием объекта WScript.FullName или для большей универсальности (тогда путь и имя скрипта будут разделены) — с использованием WScript.Path »
Не то. Это пути к исполнителю — wscript.exe/cscript.exe. Путь к каталогу скрипта — objFSO.GetParentFolderName(WScript.ScriptFullName).

mwz
30-07-2017, 10:06
Iska, да я уж вернул свою реплику в исходный вид, поняв что сам запутался. :)

Iska
30-07-2017, 11:21
mwz, бывает. Я сам такой :).




© OSzone.net 2001-2012