Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - Запуск скрипта из папки

Ответить
Настройки темы
VBS/WSH/JS - Запуск скрипта из папки

Новый участник


Сообщения: 26
Благодарности: 0

Профиль | Отправить PM | Цитировать


Находясь в папке нажимаю пкм и запускаю скрипт (находящийся в другом месте, например в C:\Windows), как сделать так, чтобы скрипт как бы запустился из этой папки

Отправлено: 11:22, 12-08-2018

 

Ветеран


Contributor


Сообщения: 22497
Благодарности: 6508

Профиль | Отправить 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
Назначает указанный скрипт контекстному меню ico-файла.
Это сообщение посчитали полезным следующие участники:

Отправлено: 09:39, 13-08-2018 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 26
Благодарности: 0

Профиль | Отправить PM | Цитировать


Большое спасибо!!! Всё работает, но есть один нюанс (вариант первый, привязка к папке): если изначально иконка в папке не совпадает с названием папки, то всё работает - иконка переименовывается и создаётся desktop.ini если его нет, если он есть - то перезаписывается, но если название иконки уже совпадает с названием папки, то иконка НЕ переименовывается, а выводится сообщение об ошибке

и и после нажатия на кнопку ОК desktop.ini НЕ создаётся, можно ли сделать, чтобы эта ошибка не появлялась, иконка независимо от её названия всё равно переименовывалась и desktop.ini создавался. Заранее спасибо
И вот ещё что. Раньше мне приходилось заходить в папку, переименовывать значок, потом находясь в этой же папке нажимать пкм и выбирать назначить значок этой папке, теперь, когда значок переименовывается автоматически, можно ли изменить модель запуска - не заходить в папку, а прямо нажимать на папке и выбирать Назначить иконку этой папке, и vbs определит название папки, переименует иконку внутри папки и там же создаст desktop.ini и скроет оба файла? А в случае отсутствия значка в папке ничего не делать?

Последний раз редактировалось BOBAT, 13-08-2018 в 10:35.


Отправлено: 10:00, 13-08-2018 | #12


Новый участник


Сообщения: 26
Благодарности: 0

Профиль | Отправить 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"
)
Может быть Вы знаете, как применить иконку сразу после отработки vbs?

Последний раз редактировалось BOBAT, 13-08-2018 в 11:15.


Отправлено: 11:07, 13-08-2018 | #13


Ветеран


Contributor


Сообщения: 22497
Благодарности: 6508

Профиль | Отправить PM | Цитировать


Цитата BOBAT:
но есть один нюанс (вариант первый, привязка к папке): если изначально иконка в папке не совпадает с названием папки, то всё работает - иконка переименовывается и создаётся desktop.ini если его нет, если он есть - то перезаписывается, но если название иконки уже совпадает с названием папки, то иконка НЕ переименовывается, а выводится сообщение об ошибке »
Странно, я думал, что обновил код в сообщении. Оказалось, что нет, остался старый вариант, без проверки.

Замените:
Код: Выделить весь код
				objFile.Name = objFSO.GetBaseName(strSourceFolder) & ".ico"
на:
Код: Выделить весь код
				If Not StrComp(objFile.Name, objFSO.GetBaseName(strSourceFolder) & ".ico", vbTextCompare) = 0 Then
					objFile.Name = objFSO.GetBaseName(strSourceFolder) & ".ico"
				End If
Цитата BOBAT:
можно ли изменить модель запуска - не заходить в папку, а прямо нажимать на папке и выбирать Назначить иконку этой папке, и vbs определит название папки, переименует иконку внутри папки и там же создаст desktop.ini и скроет оба файла? А в случае отсутствия значка в папке ничего не делать? »
Полагаю, можно. Но я остановлюсь на варианте с привязкой к ico-файлу, как наиболее разумном.

Цитата BOBAT:
Но если, например, переименовать desktop.ini а потом отменить переименование, то иконка меняется сразу.Причём влияет, как я прочитал в интернете, только именно ручное переименование. »
Дело не в переименовании, а в уведомлении приложения об изменениях.

Цитата BOBAT:
Предлагают использовать функцию shell, которая будет уведомлять обо всех запущенных обозревателях окна, чтобы использовать обновленный desktop.ini. Этот API отображается в VBScript через Shell.Application.NameSpace( "папка\" )
Код: Выделить весь код
…
echo folder.MoveHere "%temp%\desktop.ini", 4+16+1024
…
»
Не нравится мне это. И потому что тянем разрешения на файл из %temp%, и сама надежда на то, что Проводник получит таким макаром уведомление…

Цитата BOBAT:
Может быть Вы знаете, как применить иконку сразу после отработки vbs? »
Ага. Отослать соответствующее сообщение всем окнам Проводника верхнего уровня. Токмо WSH этого делать не умеет .

Последний раз редактировалось Iska, 13-08-2018 в 13:00.

Это сообщение посчитали полезным следующие участники:

Отправлено: 12:55, 13-08-2018 | #14


Новый участник


Сообщения: 26
Благодарности: 0

Профиль | Отправить PM | Цитировать


Спасибо большое!!

Отправлено: 13:23, 13-08-2018 | #15


Новый участник


Сообщения: 26
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата Iska:
Отослать соответствующее сообщение всем окнам Проводника верхнего уровня. Токмо WSH этого делать не умеет . »
А какая программа это умеет? Может просто вставить её с параметрами в конец vbs и она отработает?

Отправлено: 14:19, 13-08-2018 | #16


Ветеран


Contributor


Сообщения: 22497
Благодарности: 6508

Профиль | Отправить PM | Цитировать


BOBAT, не «программа». Любой язык высокого уровня, работающий с WinAPI. И даже некоторые из скриптовых, например, PowerShell, AutoIt, AutoHotKey.

Отправлено: 14:40, 13-08-2018 | #17


Новый участник


Сообщения: 26
Благодарности: 0

Профиль | Отправить PM | Цитировать


Iska, подскажите, пожалуйста, как точно называется эта команда-скрипт, наверное на Autoit или AutoHotKey смогу разобраться и сделать скрипт

Последний раз редактировалось BOBAT, 13-08-2018 в 18:54.


Отправлено: 18:46, 13-08-2018 | #18


Ветеран


Contributor


Сообщения: 22497
Благодарности: 6508

Профиль | Отправить PM | Цитировать


Раньше хватало широковещательной рассылки WM\_SETTINGCHANGE message | Microsoft Docs. Но рекомендуется SHChangeNotify function | Microsoft Docs.

Отправлено: 19:10, 13-08-2018 | #19


Новый участник


Сообщения: 26
Благодарности: 0

Профиль | Отправить PM | Цитировать


Спасибо

Отправлено: 06:28, 14-08-2018 | #20



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - Запуск скрипта из папки

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Запуск скрипта из текущей директории 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




 
Переход