1

Тема: VBScript: вызов интерактивного диалога открытия файла

Это работает в Windows XP и выше и обеспечивает выбор единственного файла (без множественного выбора файлов). Это диалоговое окно открытия файла фактически используется в апплете панели управления "Учетные записи пользователей" (C:\WINDOWS\system32\nusrmgr.cpl). Вы можете задать фильтры по расширениям файлов (свойство Filter), выбрать фильтр по умолчанию (свойство FilterIndex), задать начальный каталог (свойство InitialDir).

Set objDialog = CreateObject("UserAccounts.CommonDialog")
objDialog.Filter = "WSH скрипты (*.vbs, *.js)|*.vbs;*.js|Все файлы (*.*)|*.*"
objDialog.FilterIndex = 2
objDialog.InitialDir = "C:\"
intResult = objDialog.ShowOpen
If intResult = 0 Then
    Wscript.Quit
Else
    Wscript.Echo objDialog.FileName
End If
Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

2

Re: VBScript: вызов интерактивного диалога открытия файла

Другой способ выбора файла: библиотека C:\WINDOWS\system32\safrcdlg.dll предоставляет объект "SAFRCFileDlg.FileOpen". Здесь нет практически никаких настроек. Это работает в Windows XP и выше.

Set objDialog = CreateObject("SAFRCFileDlg.FileOpen")
intResult = objDialog.OpenFileOpenDlg
WScript.Echo "Результат операции: " & CStr(intResult)
WScript.Echo "Выбран файл: " & objDialog.FileName
Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

3 (изменено: mozers, 2007-12-01 00:41:02)

Re: VBScript: вызов интерактивного диалога открытия файла

Еще один вариант (работает под любой виндой):

'Пример открытия одного или нескольких файлов через диалоговое окно
'Для работы необходимо наличие в системе COMDLG32.OCX (на большинстве машин уже присутствует)

Set OpenDialog = CreateObject("MSComDlg.CommonDialog") 'Microsoft Common Dialog Control
With OpenDialog
    .DialogTitle = "Откройте нужный Вам файл!"
    .InitDir = "C:\WINDOWS\"
    .Filter = "Все файлы (*.*)|*.*|Программы (*.com,*.exe)|*.com;*.exe|Текст (*.txt,*.log)|*.txt;*.log"
    .FilterIndex = 2
    .Flags = 2621952
    .MaxFileSize =32000
    .ShowOpen
    Filename = .Filename
End With

If (Len(OpenDialog.FileName)= 0) Then
    WScript.Echo "Файлы не выбраны!"
    WScript.Quit 1
End If

files = Split(OpenDialog.Filename, vbNullChar)
count_files = UBound(files)
If count_files > 0 Then
    path = files(0) + "\"
    For i = 1 To count_files
        WScript.Echo path + files(i)
    Next
Else
    WScript.Echo files(0)
End If

P.S.При возникновении проблем с лицензированием, ответ подскажет Google

4

Re: VBScript: вызов интерактивного диалога открытия файла

Можно вызвать диалог выбора файла, используя ActiveX-объект "InternetExplorer.Application": создаём страницу с элементом FileUpload (<INPUT type='file'>) и вызываем его метод click(), что в случае IE имитирует щелчок по кнопке "Обзор":

var IE=new ActiveXObject("InternetExplorer.Application");
IE.Navigate("about:blank"); while (IE.Busy) WScript.Sleep(100);
IE.Document.write(
  "<HTML><HEAD><TITLE>"+WScript.ScriptName+" - Выбор файла</TITLE></HEAD>"+
  "<BODY style='display:none;'><FORM><INPUT type='file'></FORM></BODY></HTML>"
);
IE.Document.close();

with (IE) {
  AddressBar=false; MenuBar=false; ToolBar=false; StatusBar=false;
  Width=0; Height=0; Visible=true;
};

IE.Document.forms[0].elements[0].click();
var FilePath=IE.Document.forms[0].elements[0].value;
IE.Quit();
WScript.Echo(FilePath? "Выбран файл: "+FilePath: "Файл не выбран.");

Окошко минимизируем, но делаем видимым, т.к. иначе, если будут открыты другие окна IE, диалог будет выводится под ними и о его существовани нельзя будет догадаться; а так он будет либо сам выводится на переднем плане, либо на панели задач будет мигатющая кнопка, позволяющая переключится на него.
Автор примера - wisgest.

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

5

Re: VBScript: вызов интерактивного диалога открытия файла

Ещё один вариант использования MSComDlg.CommonDialog, на этот раз на JScript.

Main();

function Main()
{
 var sFiles, nFiles;
 var aFiles = GetFileList();

   if ( (nFiles = aFiles.length) == 0 )
     sFiles = 'Список выбранных файлов пуст!';
   else
   {
     sFiles = 'Список выбранных файлов:\n\n';
     for (var i = 0; i < nFiles; i++) 
       sFiles += '  ' + (i + 1) + '.  ' + aFiles[i] + '\n';
   }

   WScript.Echo(sFiles);

   return(nFiles);
}


function GetFileList()
{
 var oFileDlg, aFiles;
 
  try
  {
    oFileDlg = new ActiveXObject("MSComDlg.CommonDialog");
    
    with ( oFileDlg )
    {
      // const int cdlcdlOFNHideReadOnly  = 4       (0x4);       Делает невидимым переключатель Read Only.
      // const int cdlOFNNoChangeDir      = 8       (0x8);       Вынуждает диалоговое окно устанавливать текущий каталог в тот, который был при предыдущем открытии.
      // const int cdlOFNAllowMultiselect = 512     (0x200);     Пользователь может выбрать более чем один файл. (multiple selections).
      // const int cdlOFNFileMustExist    = 4096    (0x1000);    Определяет, что можно вводить имена только существующих файлов. User can enter only names of existing files.
      // const int cdlOFNExplorer         = 524288  (0x80000);   Определяет внешний вид окна выбора.
      // const int cdlOFNLongNames        = 2097152 (0x200000);  Позволяет пользователю использовать длинные имена файлов Long filenames enable.
      Flags = 4 + 8 + 512 + 4096 + 524288 + 2097152;
      CancelError = false;
      MaxFileSize = 8192;
      filename = "";
      InitDir = "";
      DialogTitle = 'Выбор файлов: Удерживая Ctrl отметьте требуемые файлы.'
      Filter = "Все файлы|*.*|MS Word файлы|*.doc|MS Excel файлы|*.xls|Текстовые файлы|*.txt";
      FilterIndex = 1;
      ShowOpen();
      
      if ( filename.length > 0 )
      {
        aFiles = filename.split("\0");
        if ( aFiles.length > 1 )
        {
         var nFiles = aFiles.length - 1;
         var sPath  = aFiles[0];
        
           if ( sPath.charAt(sPath.length-1) != "\\" )
             sPath += "\\";

           for(var nCnt = 0; nCnt < nFiles; nCnt++)
            aFiles[nCnt] = sPath + aFiles[nCnt + 1];
            
          aFiles.length = nFiles;
        }
      }  
     }
  }
  catch(e)
  {
  }
  
  if ( aFiles == null )
   return( new Array() );
   
  return( aFiles );
}

Пример опубликовал Large Null.

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

6

Re: VBScript: вызов интерактивного диалога открытия файла

Бесплатный COM-сервер JSDlgBox.dll предоставляет упрощённые методы для вывода окон выбора и сохранения файлов, а также окон выбора цвета. Методы не имеют никаких параметров. Дистрибутив (архив) компонента имеет размер чуть более 10 Кб. Пример:

Set ob = createobject("Jsdlgbox.browser")
s = ob.openbox
WScript.Echo s
s = ob.savebox
WScript.Echo s
s = ob.colorboxrgb
WScript.Echo s ' возвращает Синий*65536 + Зеленый*256 + Красный
s = ob.colorboxhex
WScript.Echo s ' возвращает 6-символьный код (строку)

Похожие методы предоставляет бесплатный компонент JSForm.dll.

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

7

Re: VBScript: вызов интерактивного диалога открытия файла

Бесплатный COM-сервер JSSys3.dll предоставляет методы для вывода окон выбора файлов (в т.ч. нескольких), для сохранения файла, для вывода окон выбора цвета, выбора папки. Пример:

Set Sys = CreateObject("JSSys3.Ops")
r = Sys.OpenDlg("Открыть файл", "bmp", "C:\")
WScript.Echo r
r = Sys.OpenMultiDlg("Открыть несколько файлов", "", "")
WScript.Echo r
r = Sys.SaveDlg("Сохранить файл", "txt")
WScript.Echo r
r = Sys.ColorDlg
WScript.Echo r ' возвращает шестисимвольный код (строка)
r = Sys.BrowseForFolder("Выбор папки")
WScript.Echo r
Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

8 (изменено: wisgest, 2020-11-10 03:41:45)

Re: VBScript: вызов интерактивного диалога открытия файла

Проверил работоcпособность совместно с IE11 моего решения 2007 года: оказалось, каталог в пути к выбранному файлу подменяется на C:\fakepath\ (подобное поведение, по-видимому, имеет место и в немного более ранних выпусках IE).

Но всё работает как надо, если заменить

IE.Navigate("about:blank")

на «просто»

IE.Navigate("")

как было в немного предшествовавшей разновидности решения. — На самом деле это обрабатывается как

IE.Navigate("http:///")

и, вследствие неудачи подобного запроса, загружается из ресурсов страница ошибки (в IE11 с адресом res://ieframe.dll/dnserror.htm?ErrorStatus=0x800C0004#http:///)
По моим ощущениям это работает немного медленнее чем about:blank; некоторого ускорения можно добиться, если убрать ненужное в данном случае, как я теперь полагаю, ожидание

while (IE.Busy) WScript.Sleep(100);

Также у меня имеются подозрения, что (в зависимости от настроек IE) запрос "http:///" может вызвать то ли открытие сетевого подключения, то ли выход из автономного режима просмотра — что-то подобное я обнаружил около того же 2007 года.
Можно, конечно, явно указать запрос к ресурсам, но если не таскать рядом со сценарием заранее подготовленного файла с ресурсами, то его может не оказаться (например, с IE6 нет ieframe.dll).
А что, если попробовать

IE.Navigate("res://")

— это также работает (в IE11 загружается res://ieframe.dll/dnserror.htm?ErrorStatus=0x80070485#res:///) и, вероятно, заведомо не должно быть попыток каких-либо сетевых обращений.

(Предполагаю, что поколдовав с настройками безопасности, можно всё-таки заставить работать с последними выпусками IE и "about:blank" и, наоборот, испортить "res://"…)