1

Тема: VBS: Как программно вызвать окно свойств (Properties) файла

Здравствуйте.

В принципе, этот код имеется в интернете, но для VB (например здесь, но вообще много где). Но вот адаптировать его под VBS моих знаний не хватило. Может быть кто-нибудь, кому не сложно, покажет, как это можно сделать в VBS?

P.S: Или из коммандной строки, тоже подойдет.

Спасибо

2

Re: VBS: Как программно вызвать окно свойств (Properties) файла

File = "C:\Test.ext"
With CreateObject("Scripting.FileSystemObject").GetFile(File)
  Folder = .ParentFolder : Name = .Name
End With
With GetObject("new:{C08AFD90-F2A1-11D1-8455-00A0C91F3880}")
  Set Verbs = .document.Application.NameSpace(Folder).ParseName(Name).Verbs
  Verbs.Item(Verbs.Count - 1).DoIt : .ExecWB 45, 2 : .Quit
End With

3

Re: VBS: Как программно вызвать окно свойств (Properties) файла

Спс )
Код работает как надо. Но только на одном компьютере из трех (

File = "C:\Program Files\Far\Far.exe"
With CreateObject("Scripting.FileSystemObject").GetFile(File)
  Folder = .ParentFolder : Name = .Name
End With

Set wnd = GetObject("new:{C08AFD90-F2A1-11D1-8455-00A0C91F3880}")
With wnd 
  Set Verbs = .document.Application.NameSpace(Folder).ParseName(Name).Verbs
  Verbs.Item(Verbs.Count - 1).DoIt : .ExecWB 45, 2 : .Quit
End With

Windows Server 2008 R2 - отработало как и было задумано

Windows 7 Ultimate SP1 (это критично, на семерках и должно в основном работать, правда есть и машины под XP):

C:\Utils>cscript propert.vbs
Сервер сценариев Windows (Microsoft R) версия 5.8
c Корпорация Майкрософт (Microsoft Corp.), 1996-2001. Все права защищены.

C:\Utils\propert.vbs(6, 1) Ошибка выполнения Microsoft VBScript: Невозможно создание 
объекта контейнером ActiveX: 'GetObject'

Windows Server 2003 R2 (это не критично, но для общей картины):

C:\Temp>cscript test.vbs
Сервер сценариев Windows (Microsoft R) версия 5.6
c Корпорация Майкрософт (Microsoft Corp.), 1996-2001. Все права защищены.

C:\Temp\test.vbs(8, 3) (null): Неопознанная ошибка

4 (изменено: Flasher, 2015-07-08 03:37:54)

Re: VBS: Как программно вызвать окно свойств (Properties) файла

Сам тестирую на 2-й системе. Никаких проблем. А зачем лишние переделки в коде? IE стоит на последних двух?
Есть ещё возможность на время диалог показывать. Например, на 10 сек., если поменять нижний кусок на

With CreateObject("Shell.Application")
  Set Verbs = .NameSpace(Folder).ParseName(Name).Verbs
  Verbs.Item(Verbs.Count - 1).DoIt
End With
' или заменить на эту строку (но не для всех локалей):
' CreateObject("Shell.Application").NameSpace(Folder).ParseName(Name).InvokeVerb "Properties"
WScript.Sleep 10000

5 (изменено: wisgest, 2015-07-08 09:11:50)

Re: VBS: Как программно вызвать окно свойств (Properties) файла

inock пишет:

C:\Temp\test.vbs(8, 3) (null): Неопознанная ошибка

Подтверждаю (Win XP SP3, IE8).

А я ведь об этом уже говорил:

alexii пишет:

У меня, на Windows XP, порождает ошибку при попытке обращения к «.document».

Естественно, чтобы был .Document нужен Navigate().

Соответственно и лечится, например, так

    .Navigate "::{E17D4FC0-5564-11D1-83F2-00A0C90DC849}"

(в окно загружается папка «Результаты поиска», т.к. она первоначально заведомо пустая), если по хорошему, то ещё нужна бы проверка .Busy
Работает и без

    .ExecWB 45, 2
Flasher пишет:
' или заменить на эту строку (но не для всех локалей):

«Properties» — канонический глагол, не для всех локалей будет «Сво&йства».

+ открыть спойлер
FilePath = "C:\Program Files\Far\Far.exe"
With CreateObject("Scripting.FileSystemObject")
    ParentFolderPath = .GetParentFolderName(FilePath)
    FileName = .GetFileName(FilePath)
End With
With GetObject("new:{C08AFD90-F2A1-11D1-8455-00A0C91F3880}")
    .Navigate "::{E17D4FC0-5564-11D1-83F2-00A0C90DC849}"
    While (.Busy): Sleep 1: Wend
    .Document.Application.NameSpace(ParentFolderPath).ParseName(FileName).InvokeVerb("Properties")
    .Quit ' не обязательно, если окно не делать видимым, оно закроется вместе со скриптом
End With

Так же должен быть запущен Проводник, иначе

GetObject("new:{C08AFD90-F2A1-11D1-8455-00A0C91F3880}")

вызовет ошибку

Windows Script Host пишет:

Ошибка: Невозможно создание объекта контейнером ActiveX: 'GetObject'
Код: 800A01AD
Источник: Ошибка выполнения Microsoft VBScript

, т.е. затруднителен запуск от имени другого пользователя. Как помнится на XP SP1 с IE6 было достаточно, чтобы существовало хотя бы одно окно Проводника (возможно, запущенного с ключом /SEPARATE) или IE, но сейчас у меня требуется Проводник запущенный в полном наборе (с Рабочим столом).

6

Re: VBS: Как программно вызвать окно свойств (Properties) файла

+ открыть спойлер
FilePath = "C:\Program Files\Far\Far.exe"
With CreateObject("Scripting.FileSystemObject")
    ParentFolderPath = .GetParentFolderName(FilePath)
    FileName = .GetFileName(FilePath)
End With
With GetObject("new:{C08AFD90-F2A1-11D1-8455-00A0C91F3880}")
    .Navigate "::{E17D4FC0-5564-11D1-83F2-00A0C90DC849}"
    While (.Busy): Sleep 1: Wend
    .Document.Application.NameSpace(ParentFolderPath).ParseName(FileName).InvokeVerb("Properties")
    .Quit ' не обязательно, если окно не делать видимым, оно закроется вместе со скриптом
End With

Да, Ваш вариант работает под XP. Но как раз не работает под 7, ругаясь на .Navigate:

C:\TEMP\VBS>cscript propert.vbs
Сервер сценариев Windows (Microsoft R) версия 5.8
c Корпорация Майкрософт (Microsoft Corp.), 1996-2001. Все права защищены.

C:\TEMP\VBS\propert.vbs(7, 5) Ошибка выполнения Microsoft VBScript: Недопустимый
 вызов или аргумент процедуры

Так же должен быть запущен Проводник,  т.е. затруднителен запуск от имени другого пользователя.

Блин. Ради этого-то все и затевалось (( А с cacls шаманить очень не наглядно....

7

Re: VBS: Как программно вызвать окно свойств (Properties) файла

Flasher пишет:

Сам тестирую на 2-й системе. Никаких проблем.

Да. Wisgest подсказал в чем дело. Ошибка вываливается, когда пытаешься запустить скрип через runas.

А зачем лишние переделки в коде?

Вы имеете ввиду это?

Set wnd = GetObject("new:{C08AFD90-F2A1-11D1-8455-00A0C91F3880}")
With wnd 

Это просто я пытался понять, чего тут написано, и разложил конструкцию на несколько более простых строчек. Знаете, как ребенок предложение целиком не осиливает, а читает по слогам. Я не программер )

Да! А вот вариант с

With CreateObject("Shell.Application")

работает и из-под runas. А Sleep можно и побольше выставить. По крайней мере, это - нормальный рабочий вариант. Спс ))

8 (изменено: wisgest, 2015-07-08 11:53:01)

Re: VBS: Как программно вызвать окно свойств (Properties) файла

Да, Ваш вариант работает под XP. Но как раз не работает под 7, ругаясь на .Navigate

Возможно дело не в Navigate, а в "::{E17D4FC0-5564-11D1-83F2-00A0C90DC849}"?
Попробуйте, например

    .Navigate "shell:Desktop"

Если нет, попробуйте также Navigate2 вместо Navigate и, пожалуйста, проверьте

    .Navigate2 "::{E17D4FC0-5564-11D1-83F2-00A0C90DC849}"

Блин. Ради этого-то все и затевалось...

А чего и зачем надо вообще добиться?

9

Re: VBS: Как программно вызвать окно свойств (Properties) файла

.Navigate "shell:Desktop"

C:\TEMP\VBS>cscript propert2.vbs
Сервер сценариев Windows (Microsoft R) версия 5.8
c Корпорация Майкрософт (Microsoft Corp.), 1996-2001. Все права защищены.

C:\TEMP\VBS\propert2.vbs(9, 20) Ошибка выполнения Microsoft VBScript: Несоответствие
типа: 'Sleep'

.Navigate2 "::{E17D4FC0-5564-11D1-83F2-00A0C90DC849}"

C:\TEMP\VBS>cscript propert2.vbs
Сервер сценариев Windows (Microsoft R) версия 5.8
c Корпорация Майкрософт (Microsoft Corp.), 1996-2001. Все права защищены.

C:\TEMP\VBS\propert2.vbs(8, 5) Ошибка выполнения Microsoft VBScript: Недопустимый вызов или аргумент процедуры

А чего и зачем надо вообще добиться?

Типичная административная задача (изменение прав доступа на файл или папку). Хотелось бы иметь доступ к этим свойствам без того, чтобы логаутить текущего пользователя и заходить под собой. Конечно, можно запускать через runas командную строку с админскими правами и от туда уже работать с icalcs, но согласитесь, это совсем не удобный вариант.  Просто запустить проводник со своими правами не получается. То есть в новых операционных системах /separate работает не так, как раньше. Вот я вчера и призадумался... А сегодня оказалось, что таки notepad рулит ))

10

Re: VBS: Как программно вызвать окно свойств (Properties) файла

inock пишет:

Это просто я пытался понять, чего тут написано

И что, стало понятней?

inock пишет:

Но как раз не работает под 7, ругаясь на .Navigate:

Подтверждаю.

inock пишет:

По крайней мере, это - нормальный рабочий вариант. Спс ))

Пожалуйста.

11

Re: VBS: Как программно вызвать окно свойств (Properties) файла

2inock

Просто запустить проводник со своими правами не получается.

У меня на общей шаре лежит Total Commander. Его и запускаю на компах пользователей с админскими правами. Далее ВСЕ (все настройки, установку ПО) делаю из него. Ну ОЧЕНЬ удобно.
А что касается прав доступа - тут и TC - лишним будет, т.к. экран пользователя не нужен если Вы, конечно, админ...

12

Re: VBS: Как программно вызвать окно свойств (Properties) файла

inock пишет:
Сервер сценариев Windows (Microsoft R) версия 5.8 пишет:

Ошибка выполнения Microsoft VBScript: Несоответствие типа: 'Sleep'

Не диво, под влияниием AHK написал просто Sleep, вместо WScript.Sleep…

Насколько я понял задачу, то ранее я её решил для себя добавлением пункта «Запуск от имени...» в контекстное меню папок в Проводнике:

REGEDIT4

[HKEY_CLASSES_ROOT\Folder\shell\runas\command]
@=hex(2):25,53,79,73,74,65,6d,52,6f,6f,74,25,5c,65,78,70,6c,6f,72,65,72,2e,65,\
  78,65,20,2f,73,65,70,61,72,61,74,65,2c,25,4c,00
; "%SystemRoot%\explorer.exe /separate,%L"

13

Re: VBS: Как программно вызвать окно свойств (Properties) файла

wisgest пишет:

; "%SystemRoot%\explorer.exe /separate,%L"

Так оно там с висты начиная так уже не работает. /separate под XP нормально отрабатывало. А сейчас все равно будет запускаться в контексте текущего пользователя. Я там выше ссылку по notepad давал. Либо реестр править. В принципе, реестр через групповую политику можно...