|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - Запуск скрипта из папки |
|
VBS/WSH/JS - Запуск скрипта из папки
|
Новый участник Сообщения: 35 |
Профиль | Отправить PM | Цитировать Находясь в папке нажимаю пкм и запускаю скрипт (находящийся в другом месте, например в C:\Windows), как сделать так, чтобы скрипт как бы запустился из этой папки
|
|
Отправлено: 11:22, 12-08-2018 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата BOBAT:
Скрытый текст
Option Explicit
Const ReadOnly = 1
Const Hidden = 2
Const System = 4
Dim strSourceFolder
Dim objFSO
Dim objFile
Dim strDesktopIniFile
If WScript.Arguments.Count = 1 Then
strSourceFolder = WScript.Arguments.Item(0)
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
If objFSO.FolderExists(strSourceFolder) Then
strDesktopIniFile = objFSO.BuildPath(strSourceFolder, "desktop.ini")
For Each objFile In objFSO.GetFolder(strSourceFolder).Files
If StrComp(objFSO.GetExtensionName(objFile.Name), "ico", vbTextCompare) = 0 Then
objFile.Name = objFSO.GetBaseName(strSourceFolder) & ".ico"
objFile.Attributes = objFile.Attributes Or Hidden
If objFSO.FileExists(strDesktopIniFile) Then
With objFSO.GetFile(strDesktopIniFile)
.Attributes = .Attributes And Not (System Or Hidden)
End With
End If
With objFSO.CreateTextFile(strDesktopIniFile, True)
.WriteLine "[.ShellClassInfo]"
.WriteLine "IconResource=" & objFile.Name & ",0"
If Left(objFSO.GetFileVersion("C:\Windows\System32\ntdll.dll"), 2) <> "6." Then
.WriteLine "IconFile=" & objFile.Name
.WriteLine "IconIndex=0"
End If
.Close
End With
With objFSO.GetFile(strDesktopIniFile)
.Attributes = .Attributes Or (System Or Hidden)
End With
With objFSO.GetFolder(strSourceFolder)
.Attributes = .Attributes Or ReadOnly
End With
Exit For
End If
Next
Else
WScript.Echo "Can't find source folder [" & strSourceFolder & "]."
WScript.Quit 2
End If
Set objFSO = Nothing
Else
WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ <Source folder>"
WScript.Quit 1
End If
WScript.Quit 0
BOBAT, и тем не менее, правильнее будет всё же привязываться к ico-файлу, а не к фону папки. C:\Program Files\Attach Icon to Folder\Attach Icon to Folder 2.vbs
Option Explicit Const ReadOnly = 1 Const Hidden = 2 Const System = 4 Dim strIconFile Dim strSourceFolder Dim objFSO Dim strDesktopIniFile If WScript.Arguments.Count = 1 Then strIconFile = WScript.Arguments.Item(0) Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") If objFSO.FileExists(strIconFile) Then If StrComp(objFSO.GetExtensionName(strIconFile), "ico", vbTextCompare) = 0 Then With objFSO.GetFile(strIconFile) strSourceFolder = .ParentFolder.Path .Attributes = .Attributes Or Hidden End With strDesktopIniFile = objFSO.BuildPath(strSourceFolder, "desktop.ini") If objFSO.FileExists(strDesktopIniFile) Then With objFSO.GetFile(strDesktopIniFile) .Attributes = .Attributes And Not (System Or Hidden) End With End If With objFSO.CreateTextFile(strDesktopIniFile, True) .WriteLine "[.ShellClassInfo]" .WriteLine "IconResource=" & objFSO.GetFileName(strIconFile) & ",0" If Left(objFSO.GetFileVersion("C:\Windows\System32\ntdll.dll"), 2) <> "6." Then .WriteLine "IconFile=" & objFSO.GetFileName(strIconFile) .WriteLine "IconIndex=0" End If .Close End With With objFSO.GetFile(strDesktopIniFile) .Attributes = .Attributes Or (System Or Hidden) End With With objFSO.GetFolder(strSourceFolder) .Attributes = .Attributes Or ReadOnly End With Else WScript.Echo "Icon file [" & strIconFile & "] contain not an <ico> extension." WScript.Quit 3 End If Else WScript.Echo "Can't find icon file [" & strIconFile & "]." WScript.Quit 2 End If Set objFSO = Nothing Else WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ <Icon file>" WScript.Quit 1 End If WScript.Quit 0 Файл реестра для него: Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\icofile\shell\Attach Icon to Folder 2] @="Назначить выбранный значок папке" "HasLUAShield"="" [HKEY_CLASSES_ROOT\icofile\shell\Attach Icon to Folder 2\command] @=hex(2):22,00,25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,\ 00,25,00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,77,00,\ 73,00,63,00,72,00,69,00,70,00,74,00,2e,00,65,00,78,00,65,00,22,00,20,00,22,\ 00,25,00,50,00,72,00,6f,00,67,00,72,00,61,00,6d,00,46,00,69,00,6c,00,65,00,\ 73,00,25,00,5c,00,41,00,74,00,74,00,61,00,63,00,68,00,20,00,49,00,63,00,6f,\ 00,6e,00,20,00,74,00,6f,00,20,00,46,00,6f,00,6c,00,64,00,65,00,72,00,5c,00,\ 41,00,74,00,74,00,61,00,63,00,68,00,20,00,49,00,63,00,6f,00,6e,00,20,00,74,\ 00,6f,00,20,00,46,00,6f,00,6c,00,64,00,65,00,72,00,20,00,32,00,2e,00,76,00,\ 62,00,73,00,22,00,20,00,22,00,25,00,31,00,22,00,00,00 |
|
Отправлено: 09:39, 13-08-2018 | #11 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 35
|
Профиль | Отправить PM | Цитировать Большое спасибо!!! Всё работает, но есть один нюанс (вариант первый, привязка к папке): если изначально иконка в папке не совпадает с названием папки, то всё работает - иконка переименовывается и создаётся desktop.ini если его нет, если он есть - то перезаписывается, но если название иконки уже совпадает с названием папки, то иконка НЕ переименовывается, а выводится сообщение об ошибке
и и после нажатия на кнопку ОК desktop.ini НЕ создаётся, можно ли сделать, чтобы эта ошибка не появлялась, иконка независимо от её названия всё равно переименовывалась и desktop.ini создавался. Заранее спасибо И вот ещё что. Раньше мне приходилось заходить в папку, переименовывать значок, потом находясь в этой же папке нажимать пкм и выбирать назначить значок этой папке, теперь, когда значок переименовывается автоматически, можно ли изменить модель запуска - не заходить в папку, а прямо нажимать на папке и выбирать Назначить иконку этой папке, и vbs определит название папки, переименует иконку внутри папки и там же создаст desktop.ini и скроет оба файла? А в случае отсутствия значка в папке ничего не делать? |
Последний раз редактировалось BOBAT, 13-08-2018 в 10:35. Отправлено: 10:00, 13-08-2018 | #12 |
Новый участник Сообщения: 35
|
Профиль | Отправить PM | Цитировать И ещё прошу Вашей помощи.После все наших манипуляций с папками и файлами все файлы в папке создаются, атрибуты к файлам и папке выставлены правильно, но иконка на папке не меняется, или может поменяться через какое то время, или так и остаться стандартным видом. Но если, например, переименовать desktop.ini а потом отменить переименование, то иконка меняется сразу.Причём влияет, как я прочитал в интернете, только именно ручное переименование.
Предлагают использовать функцию shell, которая будет уведомлять обо всех запущенных обозревателях окна, чтобы использовать обновленный desktop.ini. Этот API отображается в VBScript через Shell.Application.NameSpace( "папка\" ) for /r %%I in (*.ico) do ( attrib -h -s -r "%temp%\desktop.ini" >nul ( echo [.ShellClassInfo] echo IconResource="%%~nxI",0 )>"%temp%\desktop.ini" attrib +h +s "%temp%\desktop.ini" ( echo set shell = CreateObject^("Shell.Application"^) echo set folder = shell.NameSpace^("%%~dpI"^) echo folder.MoveHere "%temp%\desktop.ini", 4+16+1024 )>"%temp%\updateIcon.vbs" cscript //nologo //b "%temp%\updateIcon.vbs" ) |
Последний раз редактировалось BOBAT, 13-08-2018 в 11:15. Отправлено: 11:07, 13-08-2018 | #13 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата BOBAT:
Замените: на: If Not StrComp(objFile.Name, objFSO.GetBaseName(strSourceFolder) & ".ico", vbTextCompare) = 0 Then objFile.Name = objFSO.GetBaseName(strSourceFolder) & ".ico" End If Цитата BOBAT:
Цитата BOBAT:
Цитата BOBAT:
Цитата BOBAT:
|
|||||
Последний раз редактировалось Iska, 13-08-2018 в 13:00. Отправлено: 12:55, 13-08-2018 | #14 |
Новый участник Сообщения: 35
|
Профиль | Отправить PM | Цитировать Спасибо большое!!
|
Отправлено: 13:23, 13-08-2018 | #15 |
Новый участник Сообщения: 35
|
Профиль | Отправить PM | Цитировать Цитата Iska:
|
|
Отправлено: 14:19, 13-08-2018 | #16 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать BOBAT, не «программа». Любой язык высокого уровня, работающий с WinAPI. И даже некоторые из скриптовых, например, PowerShell, AutoIt, AutoHotKey.
|
Отправлено: 14:40, 13-08-2018 | #17 |
Новый участник Сообщения: 35
|
Профиль | Отправить PM | Цитировать Iska, подскажите, пожалуйста, как точно называется эта команда-скрипт, наверное на Autoit или AutoHotKey смогу разобраться и сделать скрипт
|
Последний раз редактировалось BOBAT, 13-08-2018 в 18:54. Отправлено: 18:46, 13-08-2018 | #18 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Раньше хватало широковещательной рассылки WM\_SETTINGCHANGE message | Microsoft Docs. Но рекомендуется SHChangeNotify function | Microsoft Docs.
|
Отправлено: 19:10, 13-08-2018 | #19 |
Новый участник Сообщения: 35
|
Профиль | Отправить PM | Цитировать Спасибо
|
Отправлено: 06:28, 14-08-2018 | #20 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Запуск скрипта из текущей директории | lampich | Программирование и базы данных | 0 | 28-12-2012 23:56 | |
VBS/WSH/JS - запуск скрипта очистки папки в заданное время | noob88 | Скриптовые языки администрирования Windows | 3 | 03-04-2012 13:32 | |
2008 R2 - Запуск скрипта vbs из GP | teleonomic | Windows Server 2008/2008 R2 | 0 | 06-12-2011 11:32 | |
CMD/BAT - Копирование папки и запуск VBS-скрипта на удаленных машинах | Fill_Good_Inc | Скриптовые языки администрирования Windows | 3 | 16-05-2011 04:40 | |
FreeBSD - Запуск .sh скрипта из-под apache | fantik | Общий по FreeBSD | 0 | 30-06-2009 10:28 |
|