我有一个很少的vbs代码的小hta文件。它选择文件夹或文件,然后复制到固定位置。
<html>
<head>
<Title>File Copy </Title>
<style>
img.exco
{
position:absolute;
bottom:10px;
right:10px
}
</style>
<!--Put this sub here to avoid resize flickering.-->
<script language = "VBScript">
sub DoResize
'resize
window.resizeTo 690,350
screenWidth = Document.ParentWindow.Screen.AvailWidth
screenHeight = Document.ParentWindow.Screen.AvailHeight
posLeft = (screenWidth - 700) / 2
posTop = (screenHeight - 430) / 2
'move to centerscreen
window.moveTo posLeft, posTop
end sub
DoResize()
</script>
<HTA:APPLICATION ID=""
applicationName=""
version="1.1"
BORDER="thin"
BORDERSTYLE="static"
CAPTION="Yes"
CONTEXTMENU="no"
ICON="C:\icon\32x32.ico"
INNERBORDER="no"
MAXIMIZEBUTTON="no"
MINIMIZEBUTTON="no"
NAVIGATABLE="no"
SCROLL="no"
SCROLLFLAT="no"
SELECTION="no"
SHOWINTASKBAR="yes"
SINGLEINSTANCE="yes"
SYSMENU="yes"
WINDOWSTATE="normal"
>
<script language = "VBScript">
Sub BrowseSource_OnClick()
strStartDir = "K:\Data\"
Copy_To_PC.txtFile.value = PickFolder(strStartDir)
End Sub
Function PickFolder(strStartDir)
Dim shell : Set shell = CreateObject("Shell.Application")
Dim file : Set file = shell.BrowseForFolder(0, "Choose a file:", &H4000)
If (Not File Is Nothing) Then
PickFolder = file.self.Path
End If
Set shell = Nothing
Set file = Nothing
End Function
Sub RunScripts_OnClick()
Copy
Paste
OpenWord
End Sub
Sub Copy
End Sub
Sub Paste
msgBox "Copy Success!"
End Sub
Sub OpenWord
End Sub
</script>
</head>
<body>
<p><b><font size="4">Please select the file.</font></b></p>
<form name="Copy_To_PC">
<input type = "text" name = "txtFile" size="100" />
<input type = "button" value = "File Source" Name="BrowseSource">
<input type="button" value="Copy and Paste" name="RunScripts">
</form>
</body>
</html>
单击第一个按钮时,我在选择项目(文件夹或文件)时遇到问题。
它可以很好地获取文件夹,但在选择文件时,我在第60行得到了“未指定的错误”,请帮我解决问题。我希望文件浏览器窗口就像它现在的方式,上面有OK按钮,而不是“打开”按钮,所以我可以选择文件夹或文件。
此外,文件浏览器无法从我设置的位置启动。 如何解决?
答案 0 :(得分:2)
以下是设置开始目录和文件选择的示例。
Const GeneratedItemFlag = &h4000
dim shellApp
dim folderBrowseDialog
dim filePath
set shellApp = CreateObject("Shell.Application")
set folderBrowseDialog = shellApp.BrowseForFolder(0,"Select the file", GeneratedItemFlag, "c:\")
if folderBrowseDialog is nothing then
msgbox "No file was selected. This will now terminate."
Wscript.Quit
else
filePath= folderBrowseDialog.self.path
end if
答案 1 :(得分:2)
如何在同一窗口中选择文件夹或文件?通过MSDN,Shell.BrowseForFolder
方法会创建一个对话框,使用户可以选择文件夹,然后返回所选文件夹的Folder
对象。
因此,对于浏览文件,我们需要使用另一种方法。存在具有<input ...>
属性的原生type="file"
标记。但是,使用它会带来比专业人士更多的缺点(见下面的第二个解决方案)。
在下一个解决方案中,浏览文件是通过使用HtmlDlgHelper
对象实现的 - 这是一个模糊且记录不完整的对象,但仍可在所有Windows系统上使用...与上面提到的<input ...>
标记,此解决方案提供了定义初始位置和文件类型屏蔽。
<HTML>
<HEAD>
<Title>File/Folder Copy B</Title>
<!-- Browse for
- file: based on the HTMLDlgHelper class
registered via C:\Windows\System32\mshtmled.dll
(.OpenFileDlg returns string)
- folder: based on the Shell.BrowseForFolder method
(returns the selected folder's Folder object)
-->
<HTA:APPLICATION
ID=""
APPLICATIONNAME="28632270ym"
SCROLL="no"
SINGLEINSTANCE="yes"
WINDOWSTATE="normal"
>
<script language="VBScript">
''''''''''''''''''''''''''
''' Global State Variables
''''''''''''''''''''''''''
Dim sStartPath, sStartFile, sFilter, sCaption
sStartPath = "D:\Remote"
sStartFile = sStartPath & "\nul"
sFilter = "All Files (*.*)|*.*|" _
& "VBScript (*.vbs;*.vbc)|*.vbs;*.vbc|" _
& "HTML (*.htm;*.html;*.hta)|*.htm;*.html;*.hta|"
sCaption = "Choose a File:"
Sub Window_Onload
self.Focus()
self.moveTo 1, 1
self.ResizeTo 760,400
End Sub
Sub BrForFolder
sBFF = PickFolder(sStartPath)
If not sBFF = "" Then
document.Copy_To_PC.txtfile.value = sBFF
document.Copy_To_PC.OKbuton.value = "Treat folder"
End If
End Sub
Sub BrForFile_onclick
sBFF = Dlg.OpenFileDlg( CStr(sStartFile), , CStr(sFilter), CStr(sCaption))
If not sBFF = "" Then
document.Copy_To_PC.txtfile.value = sBFF
document.Copy_To_PC.OKbuton.value = "Treat file"
End If
End Sub
Function PickFolder(sStartPath)
Dim shell, oFldr
Set shell = CreateObject("Shell.Application")
Set oFldr = shell.BrowseForFolder(0, "Choose a folder:" _
, &H0001 + &H0004 + &H0010 + &H0020, sStartPath)
'See MSDN "BROWSEINFO structure" for constants
If (Not oFldr Is Nothing) Then
PickFolder = oFldr.Self.Path
Else
PickFolder = ""
End If
Set shell = Nothing
Set oFldr = Nothing
End Function
Sub DoFileOK()
MsgBox document.Copy_To_PC.OKbuton.value _
& " """ & document.Copy_To_PC.txtfile.value & """"
document.Copy_To_PC.txtfile.value = ""
document.Copy_To_PC.OKbuton.value = "Undefined"
End Sub
</script>
</HEAD><BODY>
<OBJECT id=Dlg classid="CLSID:3050F4E1-98B5-11CF-BB82-00AA00BDCE0B"
width=0 height=0>
</OBJECT>
<FORM name="Copy_To_PC">
<p><b><font size="3">Please select a file or folder.</font></b></p>
<input style="width:600px;" type="text" id="txtfile" name="txtfile" />
<br>
<input type="button" value="Browse for File..." id="BrForFile">
or
<input type="button" value="Browse for Folder..." onClick=BrForFolder()>
<br>
<br>Action
<input type="button" value="Undefined" id="OKbuton" onClick=DoFileOK()>
<br>
<br>Quit:
<input type="button" value="All done" onClick=self.window.close()>
</FORM></BODY></HTML>
第二个解决方案:
<html>
<head>
<Title>File/Folder Copy A</Title>
<!-- based on <input type="file"> of zero width -->
<HTA:APPLICATION
ID=""
APPLICATIONNAME="28632270my"
SCROLL="no"
SINGLEINSTANCE="yes"
WINDOWSTATE="normal"
>
<script language = "VBScript">
''''''''''''''''''''''''''
''' Global State Variables
''''''''''''''''''''''''''
sStartPath = "D:\Remote"
sFilter = "application/pdf,text/plain"
Sub Window_Onload
self.Focus()
self.moveTo 1, 1
self.ResizeTo 960,400
End Sub
Sub BrForFolder()
sBFF = PickFolder(sStartPath)
If sBFF = "" Then
'do not overwrite .txtfile.value with an empty string
Else
Copy_To_PC.txtfile.value = sBFF
Copy_To_PC.OKbuton.value = "Treat folder"
End If
'NOT possible (security reason): Copy_To_PC.fn_file.value = ""
End Sub
Sub BrForFile()
'??? how to know whether a user has pressed 'Open' or 'Cancel' ???
'http://stackoverflow.com/a/4628563/3439404
'The result of the file dialog is not exposed to the browser.
'
'??? how to set initial working directory???
' and file types??? (MSIE does not care about the accept attribute?)
sBFF = Copy_To_PC.fn_file.value
If sBFF = "" Then
'do not overwrite .txtfile.value with an empty string
Else
Copy_To_PC.txtfile.value = sBFF
Copy_To_PC.OKbuton.value = "Treat file"
End If
End Sub
Function PickFolder(sStartPath)
Dim shell : Set shell = CreateObject("Shell.Application")
Dim oFldr : Set oFldr = shell.BrowseForFolder(0, "Choose a folder:" _
, &H0001 + &H0004 + &H0010 + &H0020, sStartPath)
'See MSDN "BROWSEINFO structure" for constants
'Shell.BrowseForFolder method: Creates a dialog box that
' enables the user to select a folder and then returns
' the selected folder's Folder object.
If (Not oFldr Is Nothing) Then
PickFolder = oFldr.Self.Path
Else
PickFolder = ""
End If
Set shell = Nothing
Set oFldr = Nothing
End Function
Sub DoFileOK()
MsgBox Copy_To_PC.OKbuton.value _
& " """ & Copy_To_PC.txtfile.value & """"
Copy_To_PC.txtfile.value = ""
Copy_To_PC.OKbuton.value = "Undefined"
End Sub
</script>
</head><body><form name="Copy_To_PC">
<p><b><font size="3">Please select a file or folder.</font></b></p>
<input style="width:600px;" type="text" id="txtfile" name="txtfile" />
<input style="width:0px;" type="file" id="fn_file" name="fn_file"
accept=sFilter onChange=BrForFile() onBlur=BrForFile()>
or
<input type="button" value="...for Folder..." onClick=BrForFolder()>
<br>
<br>Action
<input type="button" value="Undefined" id="OKbuton" onClick=DoFileOK()>
<br>
<br>Quit:
<input type="button" value="All done" onClick=self.window.close()>
</form></body></html>
答案 2 :(得分:1)
第一个代码示例的HTA部分实际上存在错误,这将导致一些问题。标签上写着NAVIGATABLE =“no”。它应该是NAVIGABLE =“no”。你需要失去AT。
答案 3 :(得分:0)
<!-- :: Batch section
@echo off
setlocal
echo Select an option:
for /F "delims=" %%a in ('mshta.exe "%~F0"') do set "HTAreply=%%a"
tasklist /fi "imagename eq iexplore.exe" |find ":" > nul
if errorlevel 1 taskkill /f /im "iexplore.exe"
echo End of HTA window, reply: "%HTAreply%"
Echo hi...
echo %HTAreply%
call installation.cmd
-->
<HTML>
<HEAD>
<HTA:APPLICATION SCROLL="no" SYSMENU="no" >
<TITLE>Your Project Folder </TITLE>
<SCRIPT language="JavaScript">
window.resizeTo(440,170);
function validateForm() {
var x=document.forms["myForm"]["pname"].value;
if(x==""){
return false;
}
var fso = new ActiveXObject("Scripting.FileSystemObject");
fso.GetStandardStream(1).WriteLine(x);
window.close();
}
function selectPath() {
var objShell = new ActiveXObject("shell.application");
var objFolder;
objFolder = objShell.BrowseForFolder(0, "Example", 0, 0);
if(objFolder){
document.forms["myForm"]["pname"].value = objFolder.Self.Path;
}
}
</SCRIPT>
</HEAD>
<BODY>
<form name="myForm" onsubmit="return validateForm()">
pathtostore: <input type="text" name="pname" value="c:\program files">
<input type="button" onclick="selectPath()" value="Browse">
<br>
<br>
<input type="submit" value="ok">
</form>
</BODY>
</HTML>