2010-12-08 1 views
16

Я бы хотел, чтобы мой VBScript отображал диалоговое окно Windows Save As, но я не мог узнать, как это сделать.Как использовать общий диалог «Сохранить как» в VBScript?

Используя этот код:

Dim sfd 
Set sfd = CreateObject("UserAccounts.CommonDialog") 
sfd.ShowOpen 

я могу получить открытый диалог, но нет ShowSave метода для этого объекта (как, кажется, для подобного объекта в Visual Basic не-скрипте).

Я искал StackOverflow и googled для "[vbscript] диалогового окна сохранения" (и с "Windows Script Host"), но я нашел только темы о доступе к общим диалоговым окнам с веб-страниц и решение для диалогового окна BrowseForFolder и ничего действительно о вызывая диалог «Сохранить».

На самом деле, я могу использовать диалог «Открыть» для своей цели, потому что все, что мне нужно, это имя файла ... но поскольку я хотел бы сохранить что-то по выбранному пути, «Сохранить как» в строке заголовка диалога будет более уместным.

+1

"UserAccounts.CommonDialog" работает только на Windows XP. Он не будет работать под Windows Vista или более поздней версией. Это уместно для вас? – 2010-12-08 10:00:09

+0

Ну ... в данный момент нет, но надежное решение, вероятно, будет лучше. Спасибо за этот намек. – JayK 2010-12-08 10:05:27

+1

+1 за отличный вопрос. Чем больше я использую Google, тем больше похоже, что на самом деле это не универсальное решение. Материал там будет работать только в Windows XP (не ранее или более поздних версиях) и/или имеет внешние зависимости. Некоторые примеры даже открывают Internet Explorer и используют его диалоговое окно, пока он скрыт, что кажется мне очень плохой идеей. Также нет способа вызвать собственные API Win32 из VBScript, поэтому я почти готов заключить, что решения нет. Является ли внешняя зависимость (например, DLL-файл, который вы должны включить в сценарий), или с помощью скомпилированного языка, такого как VB 6, опция? – 2010-12-08 10:30:21

ответ

7

Я могу окончательно сказать, что нет решения, чтобы показать диалоговое окно «Сохранить как» в VBScript под версиями Windows, отличных от XP, не полагаясь на некоторые внешние зависимости, которые вы должны установить и зарегистрировать самостоятельно. Помимо очевидных помех, которые возникают в связи с простым развертыванием сценария с перетаскиванием и перетаскиванием, он также выявляет целый ряд других проблем, связанных с безопасностью и разрешениями, в частности, путем обхода UAC на машине клиента установить и зарегистрировать DLL зависимости.

Решения, которые были предложены до сих пор, полагаются либо на DLL-файл, который так просто входит в состав Windows XP, вызывая диалоговое окно «Сохранить как» на панели управления учетными записями пользователей Windows XP и/или устанавливая часть программного обеспечения только для того, чтобы он оставил после MSComDlg DLL после его удаления, который затем можно использовать из VBScript. Ни одно из этих решений действительно не удовлетворяет вышеуказанным требованиям, и ни один из предоставленных ответов даже не рассматривал возможные препятствия безопасности, которые возникли бы с их предлагаемыми решениями, о чем я говорил выше.

И поскольку вы не можете звонить напрямую в Windows API (который всегда так удобно включает в себя именно такое диалоговое окно «Сохранить как») из VBScript (не только потому, что он будет представлять угрозу безопасности, но и из-за VBScript's свободный [недостаток?] ввода), что в значительной степени оставляет желающих сделать это на холоде. Кроме того, неспособность совершать вызовы API также исключает использование любых хаков, таких как вызов SetWindowText, чтобы изменить заголовок диалогового окна Open, как это было предложено в вопросе.

Я понимаю, что это не тот ответ, который все желали. Это даже не тот ответ, который я хотел. Но, увы, это правильный ответ.

Это, как говорится, вот несколько возможных способы решения:

  1. Если вы склоняетесь к принимая любой из уже предложенных ответов, вы уже решили ввести внешнюю зависимость от DLL-файл для развертывания VBScript. После того, как вы совершили этот скачок, зачем беспокоиться о «заимствовании» или иным образом захватывать DLL из какого-то другого источника? Просто сделай один раз сам. Тривиально обернуть собственные общие функции диалога, предоставляемые Windows API, в ActiveX DLL, используя Visual Basic 6, который затем можно вызвать вашим VBScript. Риски минимальны, поскольку почти любая современная версия Windows может ожидать, что уже установлена ​​среда выполнения Visual Basic, и поскольку вы, вероятно, уже знаете VBScript, выбивание кода в VB 6 не должно быть очень сложным делом. Вы можете включить любые настраиваемые функции, которые вы хотите, и, самое главное, вы будете в полном контроле. Вам не придется беспокоиться о том, что деинсталляторы других приложений удаляют DLL, что требует ваш скрипт, вам не придется futz с установкой и удалением какого-то случайного, устаревшего приложения, и вам не придется просто скрестить пальцы и надеяться. Мы знаем, как программисты, это никогда не бывает хорошим вариантом.

    И да, я рекомендую фактически обернуть общие функции диалога, открытые API Windows, вместо того, чтобы полагаться на общий диалог OCX (comdlg32.ocx), предоставленный Visual Basic. У него есть доля проблем в Windows 7, и он не даст вам великолепных новых диалогов, которые предоставляют более поздние версии Windows. Отличная статья, объясняющая все, что вам нужно знать о Open и Save Common Dialog API и о том, как их использовать в VB 6, - available here on VBnet. Конечно, если вы действительно хотите изо всех сил, есть множество интересных вещей, которые вы можете делать с общими диалогами, все документально (с кодом!) here on VB Accelerator.

  2. Но теперь, когда вы все убеждены написать DLL ActiveX в VB 6, который обертывает общую функциональность диалога для использования в вашем VBScript, я должен задать вопрос: зачем останавливаться на достигнутом? Как только вы сделали скачок для написания код в VB 6, почему бы не переместить все вашего кода в VB 6? Конечно, это «мертвый» язык и все, но это не похоже на то, что VBScript тоже очень активен. Как я уже упоминал ранее, разница в синтаксисе практически равна нулю, а кривая обучения для разработчика VBScript примерно такая же мелкая, как и следовало ожидать. Кроме того, вы получаете все преимущества полной IDE, статической типизации, (немного) лучшей обработки ошибок, бла-бла-бла. О да, и возможность прямого вызова функций Windows API.Единственное реальное преимущество VBScript - его вездесущность, но это было лет, так как вы могли найти компьютер без установленной среды исполнения VB. Не говоря уже о том, что если вы пишете приложение, для которого требуются общие диалоговые окна, вы, вероятно, входите в диалог со своими пользователями. Возможности форм полного VB могут начать пригодиться в этот момент. Но, возможно, самым важным и наиболее важным преимуществом выбора этого маршрута является то, что вы устраняете необходимость регистрации (или включения) внешней «спутниковой» DLL - простое приложение VB 6 будет работать только с EXE на любом компьютере, на котором есть VB, который включен, по крайней мере, через Windows 7.

  3. И, наконец, в случае, если вы все взволнованы тем, что переходите от низкого VBScript к полнофункциональному VB 6, я чувствую вынуждены бросать еще один ключ в уравнение: почему бы не переместиться до такого языка, как VB.NET? Опять же, есть все новые возможности, предлагаемые в VB.NET благодаря платформе .NET Framework, но для более достойного разработчика VB/VBScript не должно быть больше нескольких недель, чтобы начать чувствовать удобство написания приложений на VB.NET , Вероятно, у них не будет полного понимания .NET Framework, и они, конечно же, не будут разрабатывать хорошие объектно-ориентированные методы проектирования, но, по крайней мере, они будут двигаться в правильном направлении. Почти все, что вы можете сделать в VBScript (или даже VB 6), вы можете делать в VB.NET. И вообще, это требует еще меньше шума, чем раньше, благодаря огромной функциональности, открытой платформой .NET Framework. Недостатком, конечно же, является то, что ваше приложение теперь требует установки .NET Framework на компьютер пользователя, что не так повсеместно, как и во время работы VB 6 (хотя сейчас это гораздо более распространено, чем даже несколько лет тому назад).

Итак, я слышу, что вы говорите, что это были не обходные пути, которые вы надеялись услышать? Да, и я. Я не тот парень, который говорит, что люди бросают все и изучают новый язык. Если VBScript продолжает работать на вас, перейдите к нему. Но если вы находитесь в тот момент, когда вы начинаете напрягаться по своим ограничениям, вероятно, пора совершить прыжок.

11

Секрет использования общего диалога из VBScript (или VBA или JScript, если на то пошло) заключается в том, что вы должны установить свою лицензию на свой компьютер. Некоторые средства разработки, такие как Visual Basic 6, будут устанавливать лицензию, но она также устанавливается в бесплатном редакторе справки Microsoft HTML (это довольно старое приложение). Интересно, что если вы устанавливаете и удаляете редактор справки HTML, он оставляет доступную версию Common Dialog License. По этой причине я хотел бы рассмотреть лицензию быть в свободном доступе и поэтому будет включать в себя запись в реестре, он создает здесь в моем ответе:

В HKLM\Software\CLASSES\Licenses\4D553650-6ABE-11cf-8ADB-00AA00C00905, установить (Default) запись в gfjmrfkfifkmkfffrlmmgmhmnlulkmfmqkqj.

После того, как это на месте, вы можете создать эти диалоги из в VBScript, используя такой код:

Set objDialog = CreateObject("MSComDlg.CommonDialog") 

Для запуска файла диалог сохранения, используйте метод ShowSave как в этом коде:

objDialog.ShowSave 

Конечно, этот объект имеет множество других методов и свойств, и вы, вероятно, захотите настроить соответствующие свойства перед запуском диалога. Например, вы можете установить фильтр файлов, чтобы в диалоговом окне отображались только определенные расширения файлов. Здесь есть хорошая ссылка на элемент управления на сайте MSDN: http://msdn.microsoft.com/en-us/library/aa259661%28v=vs.60%29.aspx.

Надеюсь, это поможет. Дайте знать, если у вас появятся вопросы.

-2
Set objDialog = CreateObject("SAFRCFileDlg.FileSave") 

' Note: If no path is specified, the "current" directory will 
'  be the one remembered from the last "SAFRCFileDlg.FileOpen" 
'  or "SAFRCFileDlg.FileSave" dialog! 
objDialog.FileName = "test_save.vbs" 
' Note: The FileType property is cosmetic only, it doesn't 
'  automatically append the right file extension! 
'  So make sure you type the extension yourself! 
objDialog.FileType = "VBScript Script" 
If objDialog.OpenFileSaveDlg Then 
    WScript.Echo "objDialog.FileName = " & objDialog.FileName 
End If 
0

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

Если это ограничение на сайт direcitonal тегов т.е. (blah.com/temp.aspx?x=0 & у = 2 & г = 3)

магазин информация в БД SQL, или плоские файлы , есть много обходных решений, но то, что сказано выше, верно. VBS не будет срезать его внутри.

0

После поиска веков я нашел jsShell - Shell Component на jsware.net. Файл содержит почтовый jsShell.dll176 кБ, VBScript зарегистрировать DLL в основном regsvr32.exe jsShell.dll, демонстрационные скрипты и четкой документации.

DLL, хорошо работает в Windows 7 и предоставляет несколько полезных методов, в том числе в диалоге Open/Save:

Dim jsS, sFileName 
jsS = CreateObject("jsShell.Ops") 
' Save as dialog 
sFileName = jsS.SaveDlg("<title>", "exe") ' Example: Filter by exe files 
sFileName = jsS.SaveDlg("<title>", "") ' Example: No extension filter 
' Open dialog 
' Example: Filter by exe, initial dir at C:\ 
sFileName = jsS.OpenDlg("<title>", "exe", "C:\") 

Когда не выбрано ни одного файла, sFileName пустая строка.

3

Если у вас есть определенный контроль над системами, на которых вы будете развертывать это, и можете быть уверены, что у них есть либо Visual Studio , либо Установлена ​​Microsoft HTML Help, вы можете использовать следующий код:

function filedialog(filt, def, title, save) 
    set dialog = CreateObject("MSComDlg.CommonDialog") 
    dialog.MaxFileSize = 256 
    if filt = "" then 
     dialog.Filter = "All Files (*.*)|*.*" 
    else 
     dialog.Filter = filt 
    end if 
    dialog.FilterIndex = 1 
    dialog.DialogTitle = title 
    dialog.InitDir = CreateObject("WScript.Shell").SpecialFolders("MyDocuments") 
    dialog.FileName = "" 
    if save = true then 
     dialog.DefaultExt = def 
     dialog.Flags = &H800 + &H4 
     discard = dialog.ShowSave() 
    else 
     dialog.Flags = &H1000 + &H4 + &H800 
     discard = dialog.ShowOpen() 
    end if 
    filedialog = dialog.FileName 
end function 

Кроме того, адаптируя один из других ответов на этот вопрос на VBScript код (спасибо @oddacorn!), вы должны добавить эту функцию, если вы не достаточной уверенности в том, что пользователи будут иметь VS или HTML Помогите. Вызовите эту функцию при запуске программы. Не беспокойтесь, если у вас уже есть ключ; в этом случае это не имеет никакого эффекта. Это должно работать на стандартной учетной записи пользователя без прав администратора.

'Make the MSComDlg.CommonDialog class available for use. Required for filedialog function. 
function registerComDlg 
    Set objRegistry = GetObject("winmgmts:\\.\root\default:StdRegProv") 
    objRegistry.CreateKey &H80000001, "Software\CLASSES\Licenses\4D553650-6ABE-11cf-8ADB-00AA00C00905" 
    objRegistry.SetStringValue &H80000001, "Software\CLASSES\Licenses\4D553650-6ABE-11cf-8ADB-00AA00C00905", "", "gfjmrfkfifkmkfffrlmmgmhmnlulkmfmqkqj" 
end function 

Обратите внимание, что я приспособил FileDialog функцию от "View Source" кода VBScript в HTML here; на современных веб-браузерах кажется, что HTML, который они используют для визуализации образцов кода, не отображается правильно (проверен на IE 8 и Chrome). Но, к счастью, код все еще присутствует в View Source.

Я нашел одну вещь критически, чтобы сделать эту работу над Windows 7 (SP1, полностью исправлена); вы должны установить dialog.MaxFileSize = 256 или вы получите ошибку во время выполнения.

То есть, следующий код не будет работать на Windows 7 SP1, но, вероятно, работает на старых версиях Windows:

Set x = CreateObject("MSComDlg.CommonDialog") 
x.ShowSave 
0
Private Sub cmdB1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmdB1.Click 
    Dim objExec, strMSHTA, wshShell, SelectFile 

    SelectFile = "" 

    ' For use in HTAs as well as "plain" VBScript: 
    strMSHTA = "mshta.exe ""about:" & "<" & "input type=file id=FILE>" _ 
      & "<" & "script>FILE.click();new ActiveXObject('Scripting.FileSystemObject')" _ 
      & ".GetStandardStream(1).WriteLine(FILE.value);close();resizeTo(0,0);" & "<" & "/script>""" 

    wshShell = CreateObject("WScript.Shell") 
    objExec = wshShell.Exec(strMSHTA) 

    SelectFile = objExec.StdOut.ReadLine() 
    Me.txtT0.Text = SelectFile 
    objExec = Nothing 
    wshShell = Nothing 
    strMSHTA = Nothing 
End Sub