首先抱歉标题不好,如果有人能更好地说出这个问题,请做。
我有这个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
消息警告。
有没有人知道为什么会这样,甚至更好如何克服它?
答案 0 :(得分:2)
在阅读完最后一条评论后 - “我希望文件打开对话框将返回完整路径,并且可以在XP和7上运行”,并且我认为您希望在WSH环境中调用此对话框,然后您可以使用CommonDialog Control。此控件在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
答案 1 :(得分:0)
这是IE中的安全设置,您可以通过启动html作为这样的hta来规避它
Set wShell=CreateObject("WScript.Shell")
Set oExec=wShell.Exec("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>""")
MsgBox oExec.StdOut.ReadAll