2013-12-16 4 views
0

WiX에서 사용자 지정 작업에 사용했던 파일 브라우저를 여는 vbscript 예제를 발견했습니다. 그러나 내가 사용하는 VBScript 함수는 BrowseForFolder() (browseforfile 아님)이라고하며 디렉토리를 선택하면 값을 반환하는 것처럼 보이지만 개별 파일을 선택하면 표시되지 않습니다. 여기에 사용자 지정 작업입니다 :WiX v3.7 - vbScript 사용자 지정 작업 BrowseForFolder()가 개별 파일 이름을 반환하지 않음

<CustomAction Id="File" Script="vbscript" Execute="immediate" Return="ignore"> 
    <![CDATA[ 
    Dim shell 
    Set shell = CreateObject("Shell.Application") 
    Dim file 
    Set file = shell.BrowseForFolder(0, "Choose a file:", &H4000) 
    Session.Property("FileName") = file.self.Path 
    ]]> 
</CustomAction> 

이 방법을 사용하여, 나는 실제로 윅스에 내장 된 디렉토리 브라우저에서 최대 단계 대화 상자에서 개별 파일을 볼 수 있습니다.

이제 폴더 이름뿐만 아니라 개별 파일 이름을 검색 할 수 있어야합니다. 어떤 도움이나 제안을 주시면 감사하겠습니다!

+0

당신이 사용자 지정 작업 외부 테스트를 시도해 봤어했다? 나는 당신이 같은 결과를 얻는다고 생각합니다. BrowseForFolder는 문서를 기반으로 폴더 개체 만 반환 할 것이라고 생각합니다. http://msdn.microsoft.com/en-us/library/windows/desktop/bb774065(v=vs.85).aspx – TheESJ

+0

빠른 답변! BrowseForFolder가 작동하지 않는 경우 vbscript에 파일 브라우저를 표시하는 비교적 짧은 방법을 알고 있습니까? – user2437443

+0

Nope. 해킹 및 문서화되지 않은 API를 사용하는 사람들과 관련된 기사가 많이 있습니다. 예 : https://gist.github.com/1932941하지만 소리가 나는 것은 아닙니다. 솔직히 네이티브 커스텀 액션을 사용할 것을 권장합니다. IFileOpenDialog http://msdn.microsoft.com/en-us/library/windows/desktop/bb776913(v=vs.85).aspx#를 참조하십시오. 용법. 가능한 경우 VBScript 사용자 지정 작업을 피해야합니다. 많은 기업에서 VBScript를 완전히 사용하지 않도록 설정하여 사용하는 설치 관리자를 손상시킬 수 있습니다. 또 다른 대안으로 MSI UI에 Wix의 화상과 같은 것을 넣고 자신 만의 UI를 정의 할 수 있습니다. – TheESJ

답변

0

이 코드를 발견했습니다.

https://gist.github.com/wangye/1932941

더 나은 이해를 그것에 몇 가지 변화가

WScript.Echo GetOpenFileName("C:\", "") 

' 
' Description: VBScript/VBS open file dialog 
'    Compatible with most Windows platforms 
' Author: wangye <pcn88 at hotmail dot com> 
' Website: http://wangye.org 
' 
' dir is the initial directory; if no directory is 
' specified "Desktop" is used. 
' filter is the file type filter; format "File type description|*.ext" 
' 
' 

Public Function GetOpenFileName(dir, filter) 
    Const msoFileDialogFilePicker = 3 


If VarType(dir) <> vbString Or dir="" Then 
    dir = CreateObject("WScript.Shell").SpecialFolders("Desktop") 
End If 

If VarType(filter) <> vbString Or filter="" Then 
    filter = "All files|*.*" 
End If 

' try to choose the way to open the dialog box. Array: TryObjectNames 
Dim i,j, objDialog, TryObjectNames 
TryObjectNames = Array(_ 
    "UserAccounts.CommonDialog", _ 
    "MSComDlg.CommonDialog", _ 
    "MSComDlg.CommonDialog.1", _ 
    "Word.Application", _ 
    "SAFRCFileDlg.FileOpen", _ 
    "InternetExplorer.Application" _ 
    ) 

On Error Resume Next 
Err.Clear 

For i=0 To UBound(TryObjectNames) 
    Set objDialog = WSH.CreateObject(TryObjectNames(i)) 
    If Err.Number <> 0 Then 
     Err.Clear 
    Else 
     Exit For 
    End If 
Next 

' Select the way to dealing the object dialog 
Select Case i 
Case 0,1,2 
    ' 0. UserAccounts.CommonDialog XP Only. 
    ' 1.2. MSComDlg.CommonDialog MSCOMDLG32.OCX must registered. 
    If i=0 Then 
     objDialog.InitialDir = dir 
    Else 
     objDialog.InitDir = dir 
    End If 
    objDialog.Filter = filter 
    If objDialog.ShowOpen Then 
     GetOpenFileName = objDialog.FileName 
    End If 
Case 3 
    ' 3. Word.Application Microsoft Office must installed. 
    objDialog.Visible = False 
    Dim objOpenDialog, filtersInArray 
    filtersInArray = Split(filter, "|") 
    Set objOpenDialog = _ 
     objDialog.Application.FileDialog(_ 
      msoFileDialogFilePicker) 
     With objOpenDialog 
     .Title = "Open File(s):" 
     .AllowMultiSelect = False 
     .InitialFileName = dir 
     .Filters.Clear 
     For j=0 To UBound(filtersInArray) Step 2 
      .Filters.Add filtersInArray(j), _ 
       filtersInArray(j+1), 1 
     Next 
     If .Show And .SelectedItems.Count>0 Then 
      GetOpenFileName = .SelectedItems(1) 
     End If 
     End With 
     objDialog.Visible = True 
     objDialog.Quit 
    Set objOpenDialog = Nothing 
Case 4 
    ' 4. SAFRCFileDlg.FileOpen xp 2003 only 
    ' See http://www.robvanderwoude.com/vbstech_ui_fileopen.php 
    If objDialog.OpenFileOpenDlg Then 
     GetOpenFileName = objDialog.FileName 
    End If 
Case 5 
    Dim IEVersion,IEMajorVersion, hasCompleted 
    hasCompleted = False 
    Dim shell 
    Set shell = CreateObject("WScript.Shell") 
    ' ????IE?? 
    IEVersion = shell.RegRead(_ 
     "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Version") 
    If InStr(IEVersion,".") > 0 Then 
     ' ?????? 
     IEMajorVersion = CInt(Left(IEVersion, InStr(IEVersion,".")-1)) 
     If IEMajorVersion > 7 Then 
      ' ???????7,?????IE7,???MSHTA?? 
      ' Bypasses c:\fakepath\file.txt problem 
      ' http://pastebin.com/txVgnLBV 
      Dim fso 
      Set fso = CreateObject("Scripting.FileSystemObject") 

      Dim tempFolder : Set tempFolder = fso.GetSpecialFolder(2) 
      Dim tempName : tempName = fso.GetTempName() 
      Dim tempFile : Set tempFile = tempFolder.CreateTextFile(tempName & ".hta") 
      Dim tempBaseName 
      tempBaseName = tempFolder & "\" & tempName 
      tempFile.Write _ 
       "<html>" & _ 
       " <head>" & _ 
       " <title>Browse</title>" & _ 
       " </head>" & _ 
       " <body>" & _ 
       " <input type='file' id='f'>" & _ 
       " <script type='text/javascript'>" & _ 
       "  var f = document.getElementById('f');" & _ 
       "  f.click();" & _ 
       "  var fso = new ActiveXObject('Scripting.FileSystemObject');" & _ 
       "  var file = fso.OpenTextFile('" & _ 
          Replace(tempBaseName,"\", "\\") & ".txt" & "', 2, true);" & _ 
       "  file.Write(f.value);" & _ 
       "  file.Close();" & _ 
       "  window.close();" & _ 
       " </script>" & _ 
       " </body>" & _ 
       "</html>" 
      tempFile.Close 
      Set tempFile = Nothing 
      Set tempFolder = Nothing 
      shell.Run tempBaseName & ".hta", 1, True 
      Set tempFile = fso.OpenTextFile(tempBaseName & ".txt", 1) 
      GetOpenFileName = tempFile.ReadLine 
      tempFile.Close 
      fso.DeleteFile tempBaseName & ".hta" 
      fso.DeleteFile tempBaseName & ".txt" 
      Set tempFile = Nothing 
      Set fso = Nothing 
      hasCompleted = True ' ?????? 
     End If 
    End If 
    If Not hasCompleted Then 
     ' 5. InternetExplorer.Application IE must installed 
     objDialog.Navigate "about:blank" 
     Dim objBody, objFileDialog 
     Set objBody = _ 
      objDialog.document.getElementsByTagName("body")(0) 
     objBody.innerHTML = "<input type='file' id='fileDialog'>" 
     while objDialog.Busy Or objDialog.ReadyState <> 4 
      WScript.sleep 10 
     Wend 
     Set objFileDialog = objDialog.document.all.fileDialog 
      objFileDialog.click 
      GetOpenFileName = objFileDialog.value 
    End If 
    objDialog.Quit 
    Set objFileDialog = Nothing 
    Set objBody = Nothing 
    Set shell = Nothing 
Case Else 
    MsgBox("No file dialog component found", MsgBoxStyle.Exclamation, "Error") 
End Select 

Set objDialog = Nothing 
End Function 
+0

링크를 포함시키지 말고 질문에 대답하십시오. – slfan