18

VBScript で Windows の [名前を付けて保存] ダイアログ ボックスを表示したいのですが、その方法がわかりませんでした。

このコードの使用:

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

[開く] ダイアログを取得できますが、ShowSaveこのオブジェクトのメソッドはありません (Visual Basic の非スクリプトに同様のオブジェクトがあるようです)。

StackOverflow を検索し、「[vbscript] 保存ダイアログ」(および「Windows Script Host」を使用) を検索しましたが、Web ページから一般的なダイアログにアクセスすることに関するスレッドとBrowseForFolderダイアログの解決策しか見つかりませんでした。保存ダイアログの呼び出しについては何も見つかりませんでした。

実際には、必要なのはファイル名だけなので、[開く] ダイアログを目的に使用できます... しかし、選択したパスに何かを保存したいので、ダイアログのタイトル バーにある [名前を付けて保存] をクリックします。より適切になります。

4

9 に答える 9

11

VBScript (または VBA または JScript) からコモン ダイアログを使用する秘訣は、マシンにそのライセンスをインストールする必要があることです。Visual Basic 6 などの特定の開発ツールはライセンスをインストールしますが、無料の Microsoft HTML Help Editor (これはかなり古いアプリです) によってもインストールされます。興味深いことに、HTML Help Editor をインストールしてからアンインストールすると、Common Dialog License がそのまま残ります。このため、ライセンスは自由に利用できると考えているため、ここで作成したレジストリ エントリを回答に含めます。

で、エントリをHKLM\Software\CLASSES\Licenses\4D553650-6ABE-11cf-8ADB-00AA00C00905に設定します。(Default)gfjmrfkfifkmkfffrlmmgmhmnlulkmfmqkqj

配置したら、次のようなコードを使用して VBScript 内からこれらのダイアログを作成できます。

Set objDialog = CreateObject("MSComDlg.CommonDialog")

ファイル保存ダイアログを起動するには、次のコードのように ShowSave メソッドを使用します。

objDialog.ShowSave

もちろん、このオブジェクトには他にもたくさんのメソッドとプロパティがあり、ダイアログを起動する前に適切なプロパティを構成する必要があるでしょう。たとえば、特定のファイル拡張子のみがダイアログに表示されるようにファイル フィルタを設定できます。ここの MSDN サイトのコントロールへの参考文献があります

お役に立てれば。ご不明な点がございましたら、お知らせください。

于 2010-12-16T18:51:10.533 に答える
8

XP 以外のバージョンの Windows で VBScript から [名前を付けて保存] ダイアログ ボックスを表示するための解決策は、自分でインストールして登録する必要がある外部依存関係に頼ることなく、断言できます。スクリプトの簡単なドラッグ アンド ドロップ展開に関してこれが引き起こす明白な干渉は別として、セキュリティとアクセス許可に関連する他の多くの問題、特にクライアントのマシンで UAC をバイパスしてインストールすることも引き起こします。依存DLLを登録します。

これまでに提案された解決策は、たまたま Windows XP に含まれている DLL ファイルに依存しており、Windows XP の [ユーザー アカウント] コントロール パネルから [名前を付けて保存] ダイアログ ボックスを呼び出したり、それ専用のソフトウェアをインストールしたりします。アンインストール後に DLLを残しておきMSComDlg、VBScript から使用できるようにします。これらのソリューションはどれも上記の要件を真に満たすものではなく、提供された回答はどれも、提案されたソリューションで発生する可能性のあるセキュリティの障害を考慮していません。

また、VBScript から Windows API (このような名前を付けて保存ダイアログが非常に便利に含まれている) を直接呼び出すことはできないため (セキュリティ上のリスクをもたらすだけでなく、VBScript の緩い [ ?SetWindowText同様に、API 呼び出しを行うことができないため、質問で示唆されているように、[開く] ダイアログのキャプションを変更するための呼び出しなどのハックの使用も妨げられます。

これが誰もが望んでいた答えではないことを私は理解しています。それは私が望んでいた答えでさえありません。しかし、残念ながら、それは正しい答えです。

そうは言っても、考えられる回避策は次のとおりです。

  1. すでに提案されている回答のいずれかを受け入れることに傾いている場合は、VBScript の展開に DLL ファイルへの外部依存関係を導入することを既に決定しています。その飛躍を遂げたら、わざわざ他のソースから DLL を「借用」したり、ハイジャックしたりする必要はありません。自分で一度作るだけです。Visual Basic 6 を使用して、Windows API によって提供されるネイティブの共通ダイアログ関数を ActiveX DLL にラップするのは簡単です。これを VBScript から呼び出すことができます。ほとんどすべての最新バージョンの Windows には既に Visual Basic ランタイムがインストールされていることが期待できるため、リスクは最小限に抑えられます。また、おそらく VBScript を既に知っているので、VB 6 でいくつかのコードを作成することはそれほど難しい作業ではないはずです。必要なカスタム機能を含めることができます。最も重要なのは、完全に制御されます。他のアプリケーションのアンインストーラーがスクリプトに必要な DLL を削除することを心配する必要はありません。推奨されないアプリケーションをランダムにインストールおよびアンインストールすることに煩わされる必要もありません。私たちはプログラマーとして、それが決して良い選択肢ではないことを知っています。

    comdlg32.ocxはい、 Visual Basic が提供するコモン ダイアログ OCX () に依存するのではなく、Windows API によって公開されているコモン ダイアログ関数を実際にラップすることをお勧めします。Windows 7 にも問題があり、それ以降のバージョンの Windows が現在提供している豪華な新しいダイアログを表示することはできません。Open および Save Common Dialog API について知っておく必要があるすべてのことと、VB 6 でそれらを使用する方法を説明する優れた記事は、VBnet で入手できます。もちろん、本当にすべてを試したい場合は、共通ダイアログで実行できる興味深いことがたくさんあります。これらはすべて (コード付きで) VB Accelerator で文書化されています。

  2. しかし、VBScript で使用する共通ダイアログ機能をラップする ActiveX DLL を VB 6 で作成することを皆さんに納得していただいたので、ここで質問する必要があります。VB 6 でコードを書き始めたら、すべてのコードを VB 6 に移行してみません? 確かに、これは「死んだ」言語ですが、VBScript がそれほど活発に機能しているわけでもありません。前述したように、構文の違いは事実上ゼロであり、VBScript 開発者の学習曲線は予想されるほど浅いものです。さらに、完全な IDE、静的型付け、(わずかに) 優れたエラー処理、何とか何とかという利点をすべて享受できます。そうそう、Windows API 関数を直接呼び出すことができます。VBScript の唯一の真の利点はその遍在性ですが、VB ランタイムがインストールされていないコンピュータを見つけることができてから数年。言うまでもなく、共通のダイアログ ボックスを必要とするアプリケーションを作成している場合は、おそらくユーザーとの対話に取り組んでいるでしょう。完全な VB のフォーム機能は、その時点で役に立ち始めるかもしれません。しかし、おそらく、このルートを選択することの最大かつ最も重要な利点は、外部の「サテライト」DLL を登録する (または含める) 必要がないことです。少なくとも Windows 7 まで含まれている VB ランタイムがインストールされている。

  3. そして最後に、低機能の VBScript からフル機能の VB 6 に移行することに興奮している場合は、方程式に別のレンチを投入する必要があると感じています: VB のような言語に移行してみませんか? 。ネット?繰り返しになりますが、.NET Framework のおかげで VB.NET にはあらゆる種類の新機能が提供されていますが、まともな VB/VBScript 開発者が VB.NET でアプリを快適に作成できるようになるまでに数週間以上かかることはありません。 . 彼らはおそらく .NET Framework を完全に理解しているわけではなく、オブジェクト指向の優れた設計手法を開発していないことは確かですが、少なくとも正しい方向に進んでいるでしょう。VBScript (または VB 6) で実行できるほとんどすべてのことは、VB.NET でも実行できます。そして一般的に、以前よりもさらに手間がかかりません。.NET Framework によって公開される計り知れない機能のおかげです。もちろん、欠点は、アプリがユーザーのコンピューターに .NET Framework をインストールする必要があることです。これは、VB 6 ランタイムほど普及していません (ただし、数年前よりもはるかに一般的になっています)。前に)。

それで、それらはあなたが聞きたいと思っていた回避策ではなかったとあなたが言っているのを聞いたことがありますか? ええ、私も。私は人々にすべてを捨てて新しい言語を学ぶように言うような人ではありません。VBScript が引き続き機能する場合は、そのまま使用してください。しかし、その限界に緊張し始めた時点にいる場合は、おそらく飛躍する時です.

于 2010-12-19T10:32:11.480 に答える
4

これを展開するシステムをある程度制御でき、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

また、この質問に対する他の回答の 1 つを 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

ここで、HTML の VBScript コードの「ソースの表示」から filedialog 関数を適用したことに注意してください。最新の Web ブラウザーでは、コード サンプルをレンダリングするために使用する HTML が正しく表示されないようです (IE 8 および Chrome でテスト済み)。しかし幸いなことに、コードはまだ View Source に残っています。

これを Windows 7 (SP1、完全にパッチ適用済み) で機能させるために重要なことが 1 つあります。設定しないと実行dialog.MaxFileSize = 256時エラーが発生します。

つまり、次のコードは Windows 7 SP1 では失敗しますが、古いバージョンの Windows ではおそらく動作します。

Set x = CreateObject("MSComDlg.CommonDialog")
x.ShowSave
于 2013-08-01T15:00:27.920 に答える
0

何年も探した後、 jsware.net でjsShell - Shell Componentを見つけました。zip ファイルにはjsShell.dll 176 kBのファイルが含まれており、基本的regsvr32.exe jsShell.dllにdll を登録するための vbscript 、デモ スクリプト、明確なドキュメントが含まれています。

DLL は Windows 7 で適切に機能し、[開く/保存] ダイアログなど、いくつかの便利なメソッドを提供します。

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は、空の文字列です。

于 2012-06-09T17:56:42.977 に答える
0

http://blogs.msdn.com/b/gstemp/archive/2004/02/18/75600.aspx には、VBScript から [名前を付けて保存] ダイアログを表示する方法が説明されています。

http://www.eggheadcafe.com/software/aspnet/29155097/safrcfiledlg-has-been-deprecated-by-microsoft.aspxによると、 SAFRCFileDlg は Microsoft によって廃止されていることに注意してください。

于 2010-12-13T23:13:13.357 に答える
0

シェルを作成し、それをasp Webサイトにリンクし、Webサイトに方向タグを読み取らせました-ファイルの場所をロードしました.aspページは、そのファイルの場所のすぐ近くにファイルダイアログを開き、ファイル名も指定されています方向タグ。保存すると、シェルは消えます。

それがウェブサイトの方向タグの制限である場合、つまり (blah.com/temp.aspx?x=0&y=2&z=3)

情報をSQLデータベースまたはフラットファイルに保存する場合、回避策はたくさんありますが、上記のことは真実です. VBS は内部的にそれをカットしません。

于 2011-11-11T19:36:04.080 に答える
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
于 2014-09-25T05:53:39.857 に答える
-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
于 2011-05-06T02:05:21.007 に答える