vbscript - español - ejecutar vbs
Selección de archivo o carpeta VBScript (4)
Tengo un pequeño archivo hta con algunos códigos vbs. Selecciona carpeta o archivo y luego realiza una copia en una ubicación fija.
<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>
Tengo problemas para seleccionar elementos (carpeta o archivo) cuando hago clic en el primer botón.
Capta bien la carpeta, pero cuando selecciono archivos, recibí un "error no especificado en la línea 60", por favor ayúdenme a solucionarlo. Quiero que la ventana del navegador de archivos sea como está ahora con el botón Aceptar, no con el botón "abrir", así puedo seleccionar tanto la carpeta como el archivo.
Además, el explorador de archivos no se inicia desde la ubicación que configuré. ¿Como arreglarlo?
¿Cómo seleccionar carpeta o archivo en la misma ventana? Por MSDN , el método Shell.BrowseForFolder
crea un cuadro de diálogo que permite al usuario seleccionar una carpeta y luego devuelve el objeto Folder
la carpeta seleccionada.
Por lo tanto, para buscar un archivo , necesitamos usar otro método. Existe el atributo nativo <input ...>
tag with type="file"
. Sin embargo, su uso trae más inconvenientes que ventajas (ver segunda solución a continuación).
En la siguiente solución, Browse for File se logra utilizando el objeto HtmlDlgHelper
, un objeto oscuro y poco documentado que, sin embargo, está disponible en todos los sistemas de Windows ... En comparación con la etiqueta <input ...>
mencionada anteriormente, esta solución ofrece a definir tanto la ubicación inicial como el enmascaramiento del tipo de archivo.
<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>
Segunda solución:
<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://.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>
Aquí hay un ejemplo de cómo configurar el directorio de inicio y la selección de archivos.
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
De hecho, hay un error en la parte HTA del primer ejemplo de código que causará algunos problemas en el camino. La etiqueta dice NAVIGATABLE = "no". Debería ser NAVIGABLE = "no". Debes perder el AT.
<!-- :: 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>