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

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Нужен bat для удаления ИЗМЕНЁННЫХ папок и программ (ярлыков) из меню "Пуск-Программы"

Ответить
Настройки темы
CMD/BAT - Нужен bat для удаления ИЗМЕНЁННЫХ папок и программ (ярлыков) из меню "Пуск-Программы"

Аватара для Nun-Nun

Ветеран


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


Конфигурация

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


Изменения
Автор: Nun-Nun
Дата: 01-03-2011
Нужен батник для поиска и удаления папок и программ (ярлыков) из меню "Пуск->Программы", организованный таким образом, чтобы можно было найти и удалить искомое, даже если пользователь изменил их дефолтное расположение и название.

Отправлено: 15:11, 26-02-2011

 

Ветеран


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

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


Nun-Nun, Ваш вопрос не ясен.
Цитата Nun-Nun:
даже если пользователь изменил их дефолтное расположение и название. »
«Пользователь изменил расположение» — всё же, в пределах Главного меню?! Или, скажем, если сдуру перетащил к себе на Рабочий стол?! Так?

«и название» — тут придётся ориентироваться на свойство ярлыка target. Нужно будет знать это самое значение target — раз, исходное название и местоположение ярлыка — два.

Во всяком случае, задача явно не для пакетных файлов, скорее это для Automation — WSH/PoSH/AutoIt.

Отправлено: 11:16, 01-03-2011 | #2



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

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


Аватара для Nun-Nun

Ветеран


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

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


Цитата Iska:
в пределах Главного меню?! Или, скажем, если сдуру перетащил к себе на Рабочий стол?!»
Только в пределах главного меню. Рабочий стол и т.п. я не имею в виду.
Цитата Iska:
«и название» — тут придётся ориентироваться на свойство ярлыка target. »
Может быть, но мне кажется, что лучше ориентироваться на исполняемый файл, запускаемый ярлыком.

-------
Свобода не означает вседозволенность.


Отправлено: 12:42, 01-03-2011 | #3


Ветеран


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

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


Цитата Nun-Nun:
Может быть, но мне кажется, что лучше ориентироваться на исполняемый файл, запускаемый ярлыком. »
Это оно и есть.

Примерно так:
читать дальше »
Код: Выделить весь код
Option Explicit

Dim objFSO
Dim arrTargetPaths


arrTargetPaths = Array("C:\WINDOWS\winhlp32.exe", "C:\WINDOWS\winhelp.exe", "C:\WINDOWS\Installer\{90110419-6000-11D3-8CFE-0150048383C9}\wordicon.exe")

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

With WScript.CreateObject("Shell.Application")
	ScanSubFolders objFSO.GetFolder(.NameSpace("shell:Start Menu").Self.Path), arrTargetPaths
	ScanSubFolders objFSO.GetFolder(.NameSpace("shell:Common Start Menu").Self.Path), arrTargetPaths
End With

Set objFSO = Nothing

WScript.Quit 0
'=======================================================

'=======================================================
Sub ScanSubFolders(objFolder, arrTargetPaths)
	Dim objSubFolder
	Dim objFile
	
	Dim elem
	
	WScript.Echo "[" & objFolder.Path & "]"
	
	For Each objFile In objFolder.Files
		If UCase(objFSO.GetExtensionName(objFile.Path)) = UCase("lnk") Then
			With WScript.CreateObject("WScript.Shell").CreateShortcut(objFile.Path)
				For Each elem In arrTargetPaths
					If UCase(elem) = UCase(.TargetPath) Then
						WScript.Echo vbTab, "Name:   ", objFSO.GetBaseName(objFile.Name)
						WScript.Echo vbTab, "Path:   ", objFile.Path
						WScript.Echo vbTab, "Target: ", .TargetPath
						WScript.Echo vbTab
						
						'objFile.Delete True
						
						Exit For
					End If
				Next
			End With
		End If
	Next
	
	For Each objSubFolder In objFolder.SubFolders
		ScanSubFolders objSubFolder, arrTargetPaths
	Next
End Sub
'=======================================================
Поиск осуществляется в «Главном меню» текущего пользователя и в общем «Главном меню». Перечень target'ов задаётся массивом «arrTargetPaths»:
Код: Выделить весь код
arrTargetPaths = Array("C:\WINDOWS\winhlp32.exe", "C:\WINDOWS\winhelp.exe", "C:\WINDOWS\Installer\{90110419-6000-11D3-8CFE-0150048383C9}\wordicon.exe")
Удаление найденного ярлыка в скрипте «во избежание» закомментировано:
Код: Выделить весь код
'objFile.Delete True
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:05, 03-03-2011 | #4


Аватара для Nun-Nun

Ветеран


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

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


Цитата Iska:
Поиск осуществляется в «Главном меню» текущего пользователя и в общем «Главном меню». Перечень target'ов задаётся массивом «arrTargetPaths»: »
Допустимо ли в массиве target'ов задавать не только удаление ярлыков, но и отдельных папок, в которых эти ярлыки могут оказаться расположены (разумеется, за исключением самой папки "Программы" и папок типа "Стандартные", "Автозагрузка", "Администрирование" и т.п.)?

-------
Свобода не означает вседозволенность.


Отправлено: 15:45, 03-03-2011 | #5


Ветеран


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

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


Цитата Nun-Nun:
Допустимо ли в массиве target'ов задавать не только удаление ярлыков, но и отдельных папок…»
Задавать — допустимо, но работать это, понятное дело, не будет, ибо как не предусматривалось исходным ТЗ.

Опишите подробнее Вашу ситуацию, может станет яснее.

Отправлено: 18:14, 03-03-2011 | #6


Аватара для Nun-Nun

Ветеран


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

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


Цитата Iska:
Опишите подробнее Вашу ситуацию, может станет яснее. »
Всё очень "просто": в меню "Программы" исходная программа может устанавливаться в самостоятельную папку. Возьмём, к примеру, программу 7-Zip. При её установке в меню "Программы" создаётся отдельная папка "7-Zip", в которой, соответственно, создаются ярлыки для файлов программы: "7-Zip 9.20", "Деинсталляция 7-Zip 9.20" и т.п. После установки программы пользователь может поступить так:
1) ничего не переименовывая, перетащить исходную папку установленной программы вместе с ярлыками в другую папку меню "Программы";
2) перетащить ярлыки установленной программы (как переименовав, так и не переименовав) в другую папку меню "Программы", а исходную папку (например, того же "7-Zip") удалить;
3) не перетаскивая исходной папки установленной программы, только переименовать ярлыки;
4) не перетаскивая исходной папки установленной программы, переименовать её (папку) и (или) ярлыки в ней;
5) ничего не перетаскивая, переименовать только исходную папку установленной программы, не трогая названий ярлыков;
6) ничего не перетаскивая, переименовать и исходную папку установленной программы, и названия ярлыков;
7) переименовать и исходную папку установленной прграммы, и названия ярлыков, а также перетащить всё это в другую папку меню "Программы".

Конечно предсказать пользовательские действия и причуды хотя и сложно, но во всех перечисленных вариантах единственное, что всегда будет оставаться неизменным это название исполняемого файла установленной программы. Поэтому на него и придётся ориентироваться.

Таким образом, поставленная задача выглядит так: найти и обезвредить (соррри, - удалить) последствия этого пользовательского рукоблудия (удалить и ярлыки, и папку, в которой они оказались (если, конечно, это отдельная папка)). При этом, разумеется, необходимо исключить возможность удаления как самого меню "Программы", так и расположенных в нём стандартных папок типа "Стандартные", "Автозагрузка", "Администрирование", "Утилиты" и т.п.

P.S. Уровень моих навыков в области написания bat-файлов пока ещё не на том уровне, чтобы решить подобную задачу самостоятельно, вот и приходится обращаться за помощью.

-------
Свобода не означает вседозволенность.


Отправлено: 21:38, 03-03-2011 | #7


Ветеран


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

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


Nun-Nun, задача в поставленном виде банально не решаема (разве что иметь предварительно подготовленным весь эталонный набор ярлыков). Но, дабы не предсказывать действия пользователей — придумали групповые политики, в данном случае это:
Код: Выделить весь код
Политика "Локальный компьютер"	
   Конфигурация пользователя	
      Административные шаблоны 	
         Панель задач и меню "Пуск"
и там смотрите, в частности:
Код: Выделить весь код
Удалить контекстные меню перетаскивания для элементов меню "Пуск"	
Запретить изменение параметров панели задач и меню "Пуск"	
Запретить доступ к контекстному меню для панели задач	
Удаление значка доступа к программам и параметров по умолчанию из меню "Пуск"
(пример приведён для локальной групповой политики на изолированной машине Windows XP).

Если нет домена — для рабочей группы можно организовать распространение настроек политик посредством файлов реестра (это, конечно, не политики, но хотя бы так). Описание соответствия групповых политик можно взять из «gp.chm» из комплекта «Resource Kit» Windows 2000, или (для нынешних систем) отсюда: Download details: Group Policy Settings Reference for Windows and Windows Server, или, наконец, банально отсюда: Твики реестра (CHM) 1.9.

По поводу же скрипта из #4, единственное, что могу предложить — поправить его так, дабы он удалял пустые папки, оставшиеся пустыми после удаления указанных ярлыков. Кстати, вопрос — перечень в «arrTargetPaths» у Вас длинный? Может, стоит сделать чтение данного перечня из текстового файла?!

P.S. Наткнулся в Download details: Group Policy Settings Reference for Windows and Windows Server на весьма пользительную ссылку — Group Policy Search: указываем политику и сразу видим толкование, путь к политике в редакторе, применимость к ОС и параметр реестра, куда пишется данная политика при её применении.

Последний раз редактировалось Iska, 03-03-2011 в 22:28. Причина: Дополнение про «Group Policy Search»

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

Отправлено: 22:23, 03-03-2011 | #8


Аватара для Nun-Nun

Ветеран


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

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


Цитата Iska:
По поводу же скрипта из #4, единственное, что могу предложить — поправить его так, дабы он удалял пустые папки, оставшиеся пустыми после удаления указанных ярлыков. »
Да, добавьте если не сложно.
Цитата Iska:
Кстати, вопрос — перечень в «arrTargetPaths» у Вас длинный? Может, стоит сделать чтение данного перечня из текстового файла?! »
Нет, перечень не длинный. Подразумевается использование данного скрипта в аддонах программ. Предполагается, что каждый такой аддон будет проверять только наличие ранее установленной версии одной конкретной программы, и если находит, то удаляет её папку и ярлыки. Устанавливаемые программы (в подавляющем большинстве случаев) имеют всего один исполняемый файл, а при инсталляции создают в меню "Пуск" свою собственную папку с 1-5 ярлыками в ней, так что если пользователь ничего не менял, и в названиях папки и расположенных в ней ярлыков (на исполняемый или иной файл) встречается одинаковое выражение (например, "7-Zip"), то можно смело удалять всю папку вместе с ярлыками. Наиболее сложная часть эпопеи с поиском, описанным в предыдущем посте, имеет место только в случае, когда пользователь переименовал папку и (или) ярлыки; если пользователь только перетащил папку программы вместе с ярлыками в другое место, то, насколько понимаю, необходимые поиск и удаление будут не очень сложными, тут поиск может быть организован не только по названию исполняемого файла, но и по конкретному выражению в названиях папок и ярлыков, например, "7-Zip".

P.S.

В идеале весь процесс работы по нахождению-удалению я вижу таким: при установке аддон запускает поиск по конкретному выражению в названиях папок и ярлыков:

- если оно найдено в названии папки - удаление этой папки вместе с ярлыками;
- если оно найдено только в названии ярлыка (ярлыков) - удаление этого ярлыка (ярлыков);
- если после удаления ярлыка (ярлыков) папка осталась пустой - удаление этой папки (разумеется, если это не сама папка меню "Программы" или расположенные в ней типа "Стандартные", "Автозагрузка", "Администрирование", "Утилиты" и т.п.);
- если ничего не найдено по конкретному выражению, то запуск поиска ярлыка (ярлыков) по названию исполняемого файла, при этом:
- если такой ярлык найден - удаление этого ярлыка (если после удаления ярлыка папка осталась пустой - удаление папки (за исключением вышеназванных стандартных)).

Вот, в принципе, так.

-------
Свобода не означает вседозволенность.


Последний раз редактировалось Nun-Nun, 04-03-2011 в 11:35.


Отправлено: 11:12, 04-03-2011 | #9


Ветеран


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

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


Цитата Nun-Nun:
добавьте если не сложно. »
Добавил (удаление папок так же закомментировано):
Код: Выделить весь код
	If objFolder.Files.Count = 0 And objFolder.SubFolders.Count = 0 Then
		'objFolder.Delete True
	End If
но не проверял:
читать дальше »
Код: Выделить весь код
Option Explicit

Dim objFSO
Dim arrTargetPaths


arrTargetPaths = Array("C:\WINDOWS\winhlp32.exe", "C:\WINDOWS\winhelp.exe", "C:\WINDOWS\Installer\{90110419-6000-11D3-8CFE-0150048383C9}\wordicon.exe")

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

With WScript.CreateObject("Shell.Application")
	ScanSubFolders objFSO.GetFolder(.NameSpace("shell:Start Menu").Self.Path), arrTargetPaths
	ScanSubFolders objFSO.GetFolder(.NameSpace("shell:Common Start Menu").Self.Path), arrTargetPaths
End With

Set objFSO = Nothing

WScript.Quit 0
'=======================================================

'=======================================================
Sub ScanSubFolders(objFolder, arrTargetPaths)
	Dim objSubFolder
	Dim objFile
	
	Dim elem
	
	WScript.Echo "[" & objFolder.Path & "]"
	
	For Each objFile In objFolder.Files
		If UCase(objFSO.GetExtensionName(objFile.Path)) = UCase("lnk") Then
			With WScript.CreateObject("WScript.Shell").CreateShortcut(objFile.Path)
				For Each elem In arrTargetPaths
					If UCase(elem) = UCase(.TargetPath) Then
						WScript.Echo vbTab, "Name:   ", objFSO.GetBaseName(objFile.Name)
						WScript.Echo vbTab, "Path:   ", objFile.Path
						WScript.Echo vbTab, "Target: ", .TargetPath
						WScript.Echo vbTab
						
						'objFile.Delete True
						
						Exit For
					End If
				Next
			End With
		End If
	Next
	
	For Each objSubFolder In objFolder.SubFolders
		ScanSubFolders objSubFolder, arrTargetPaths
	Next
	
	If objFolder.Files.Count = 0 And objFolder.SubFolders.Count = 0 Then
		'objFolder.Delete True
	End If
End Sub
'=======================================================

Цитата Nun-Nun:
Предполагается, что каждый такой аддон будет проверять только наличие ранее установленной версии одной конкретной программы, и если находит, то удаляет её папку и ярлыки. Устанавливаемые программы (в подавляющем большинстве случаев) имеют всего один исполняемый файл, а при инсталляции создают в меню "Пуск" свою собственную папку с 1-5 ярлыками в ней, так что если пользователь ничего не менял, »
А как быть с теми программами, которые используют одну папку в Главном меню, например, MS Office и FrontPage?!

P.S. Есть подозрение, что Вы не сможете его использовать при установке в виде Addon'ов в таком виде из-за «CreateObject("Shell.Application")».
Это сообщение посчитали полезным следующие участники:

Отправлено: 07:08, 05-03-2011 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Нужен bat для удаления ИЗМЕНЁННЫХ папок и программ (ярлыков) из меню "Пуск-Программы"

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
[решено] Как удалить ярлыки (в меню "Пуск" - "Программы", с рабочего стола, и т. д.) Craager Автоматическая установка Windows 2000/XP/2003 167 08-05-2015 02:50
Интерфейс - [решено] Исчез список программ в подменю "Все программы" меню "Пуск" sewell Microsoft Windows 7 23 21-03-2011 16:51
Установка - Удаление меню "Програмы" из меню "Пуск" fragnat Microsoft Windows 2000/XP 2 07-02-2010 23:54
Груп,Политика "программы" в меню "пуск" ??????????????????? pushkin88 Microsoft Windows NT/2000/2003 0 07-05-2009 20:19
Запретить/удалить пункт "Programs" ("Программы") из меню кнопки "Start" ("Пуск") submaster Microsoft Windows NT/2000/2003 5 13-09-2006 12:29




 
Переход