0

最初に悪いタイトルで申し訳ありません。誰かがこの質問にもっと良い名前を付けることができれば、してください。

私はこのHTMLファイルを持っています:

<html>
  <form action='' method='post'>
    <input id='inbox' type='file' />
    <input id='outbox' type='button' onclick='alert(inbox.value);' 
      value='submit' />
  </form>
</html>

IE で開き、ファイルを参照して [送信] ボタンをクリックすると、選択したファイルへのフル パスが表示されます。しかし、VBScript で同じスクリプトを作成しようとすると、次のようになります。

Set IE = CreateObject("InternetExplorer.Application")
IE.Offline = True
IE.Navigate "about:blank"

Do
Loop While IE.Busy

html = "<html>" &_
       "  <form action='' method='post'>" &_
       "    <input id='inbox' type='file' />" &_
       "    <input id='outbox' type='button' onclick='alert(inbox.value);'" &_
       "      value='submit' />" &_
       "  </form>" &_
       "</html>"

IE.Document.write html
IE.Width = 0
IE.Height = 0
IE.Document.All("inbox").Click
IE.Document.All("outbox").Click

悪名高いc:\fakepath\file.extメッセージで警告されます。

これがなぜなのか、それを克服する方法がさらに良いのか、誰かが考えを持っていますか?

4

2 に答える 2

2

最後のコメントを読んだ後、「フル パスを返し、XP および 7 で動作するファイルを開くダイアログが必要です」と表示されます。WSH 環境でこのダイアログを呼び出したい場合は、CommonDialog コントロールを使用できます。このコントロールは Windows 8 では無効になっていますが、意図したとおり、Windows 7 までは正常に機能します。64 ビット Windows では、デフォルトで .VBS ファイルは 64 ビット プロセスとして実行されますが、その制御は 32 ビットであることに注意する必要があります。そのため、スクリプトを 32 ビット プロセスとして再起動するコードと関数をサンプル コードに含めます。

Call Force32bit

With CreateObject("MSComDlg.CommonDialog")
    .Filter = "Text files (*.txt)|*.txt|All files (*.*)|*.*"
    .InitDir = CreateObject("WScript.Shell").SpecialFolders("MyDocuments")
    .MaxFileSize = 256
    .Flags = &H80000 + &H4 + &H8
    .ShowOpen
    If Len(.FileName) Then
        WScript.Echo .FileName
    Else
        WScript.Echo "Canceled"
    End If
End With

Sub Force32bit()
    Dim sWinDir, sSys64, sSys32, oShell
    Set oShell = CreateObject("WScript.Shell")
    sWinDir = oShell.ExpandEnvironmentStrings("%WinDir%")
    With CreateObject("Scripting.FileSystemObject")
        sSys64 = .BuildPath(sWinDir, "SysWOW64")
        If Not .FolderExists(sSys64) Then Exit Sub
        sSys32 = .BuildPath(sWinDir, "System32")
        If sSys32 = WScript.Path Then
            oShell.CurrentDirectory = sSys64
            oShell.Run "wscript.exe " & Chr(34) & _
            WScript.ScriptFullName & Chr(34), 1, False
            WScript.Quit
        End If
    End With
End Sub
于 2013-02-18T07:43:17.363 に答える