получить папку Common Documents в VBS

К моему большому огорчению, я должен использовать VBS для написания пользовательского действия InstallShield 2010 LE. У меня нет опыта работы с VBS, поэтому я в основном собираю фрагменты кода, которые нахожу.

Мне нужно получить доступ к папке «Общие документы» (CSIDL_COMMON_DOCUMENTS). Он не определен в WScript.Shell.SpecialFolders (хотя All Users Desktop определен). Я нашел пример кода, который пытается связать системную DLL:

Private Declare Function SHGetFolderPath Lib "shfolder.dll" _
Alias "SHGetFolderPathA" _
    (ByVal hwndOwner As Long, _
    ByVal nFolder As Long, _
    ByVal hToken As Long, _
    ByVal dwReserved As Long, _
    ByVal lpszPath As String) As Long

Но когда я пытаюсь запустить его в VbsEdit, я получаю следующую ошибку в первой строке:

Microsoft VBScript compilation error: Expected end of statement

Есть идеи?


person japreiss    schedule 04.01.2012    source источник
comment
Обычно проще передать его как параметр из installshield. Таким образом, вы можете контролировать, где и что вы делаете из одного места.   -  person Tony Hopkinson    schedule 04.01.2012
comment
Справка Installshield говорит: функции VBScript не могут принимать аргументы от пользовательских действий. Как бы я это сделал?   -  person japreiss    schedule 04.01.2012
comment
Гм, я этого не знал, но вы можете обмануть и использовать Session.Property. Таким образом, вы устанавливаете свойство docFolder вне скрипта, затем выбираете его внутри функции и используете.   -  person Tony Hopkinson    schedule 07.01.2012


Ответы (2)


Украдено из здесь

  Const CSIDL_COMMON_DOCUMENTS = &h2e
  Dim objShell : Set objShell = CreateObject("Shell.Application")
  WScript.Echo objShell.Namespace(CSIDL_COMMON_DOCUMENTS).Self.Path

выход:

C:\Documents and Settings\All Users\Documents
person Ekkehard.Horner    schedule 04.01.2012
comment
Технически этот код не будет работать в пользовательском действии, потому что объект WScript недоступен при работе в качестве ЦС MSI. Объектом по умолчанию является объект Session, а не WScript или CScript. - person Christopher Painter; 05.01.2012

Игнорируя тот факт, что пользовательские действия VBScript очень проблематичны, вы можете просто запросить у установщика Windows расположение папки CommonAppDataFolder.

Свойство CommonAppDataFolder

commonAppDataFolder = session.Property("CommonAppDataFolder")
person Christopher Painter    schedule 04.01.2012
comment
Что делает их такими проблематичными? Меня уже раздражает работа с VBS, хотелось бы веских причин переключиться! - person japreiss; 05.01.2012
comment
Прочтите ссылку ниже по причинам. Что касается альтернативы, в моем блоге есть отличный контент, в котором обсуждается, как писать настраиваемые действия чистого управляемого кода с использованием WiX DTF, инкапсулировать их в модули слияния WiX и затем использовать в проектах InstallShield LE. IS LE очень ограничен в том, что и где он позволяет вам планировать ЦС, и мое решение работает вокруг всего этого, чтобы получить всю мощь MSI.blogs.msdn.com/b/robmen/archive/2004/05/20/136530.aspx - person Christopher Painter; 05.01.2012