Имя пользователя:
Пароль:
 

Название темы: Запуск скрипта из папки
Показать сообщение отдельно

Ветеран


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

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


BOBAT, ясно. Понимаете, в чём дело… Скрипт у Вас находится в каталоге %SystemRoot%, пакетный файл, надо полагать, там же, рядом с ним (иначе Вы его таким кодом не запустите). Пакетный файл (из какой бы папки Вы не запускали скрипт) считает целевым каталогом тот, в котором находится сам (Set fldr=%~dp0), и всякий раз отрабатывает на том же каталоге %SystemRoot%.

Для начала давайте избавимся от пакетного файла вовсе. Назовём скрипт «Attach Icon to Folder.vbs» и поместим его в собственный каталог «Attach Icon to Folder» в «%ProgramFiles%»:
C:\Program Files\Attach Icon to Folder\Attach Icon to Folder.vbs
Код: Выделить весь код
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.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

Для внедрения в контекстное меню используем следующий файл реестра:
Код: Выделить весь код
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\Background\shell\Attach Icon to Folder]
@="Назначить значок папке"
"HasLUAShield"=""

[HKEY_CLASSES_ROOT\Directory\Background\shell\Attach Icon to Folder\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,2e,00,76,00,62,00,73,00,\
  22,00,20,00,22,00,25,00,56,00,22,00,00,00
здесь значение параметра по умолчанию раздела command — «"%SystemRoot%\System32\wscript.exe" "%ProgramFiles%\Attach Icon to Folder\Attach Icon to Folder.vbs" "%V"» с типом REG_EXPAND_SZ (вместо типичного REG_SZ).

Сохраните скрипт по указанному месту, импортируйте файл реестра в реестр, пользуйте.

P.S. Но идея реализации мне всё равно категорически не нравится. Я бы привязывался не к папке (HKEY_CLASSES_ROOT\Directory\Background), а к файлам *.ico — так будет и правильнее, и надёжнее, и позволит указать конкретный файл ico, если их будет несколько.

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

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

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

Название темы: Запуск скрипта из папки