i need to write a text area (box) value to .txt i am getting permissions denied when writing to "input.txt"
i got got permission denied when writing input.txt from the text box. i edited using suggestions found below and also killed handle for input.txt using process explorer.
using the code below i can now save textbox text to text file input.txt.
i also figured out how to call upon a batch file to change that text into a cyphered form, and then i added a refresh button to open that changed text into a second textbox as a final output result which leaves the text now capable of being password encrypted after being saved in input.txt and opened in a second textbox from file SR-Encrypted.txt after being cyphered via batch file encrypter.bat then by refreshing the page using the refresh button i added..
thank you agnar!
<html>
<script language="vbscript">
option explicit
Const ForWriting = 2
Dim objFSO, objFile, strFileName, objshell
strFileName = "input.txt"
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("WScript.Shell")
Sub Submitarea
Set objFile = objFSO.OpenTextFile(strFileName, 2, True)
objfile.Write TextFile.Value
objFile.Close
MsgBox "Your text has been added to " & strFileName, 64, "Textarea Input"
End Sub
</script>
</html>
</head>
<title>Example</title>
<script language="VBScript">
Sub test
set oFSO=CreateObject("Scripting.FileSystemObject")
set oFile=oFSO.OpenTextFile("SR-Encrypted.txt",1)
text=oFile.ReadAll
document.all.ScriptArea.value=text
Set objFile = nothing
oFile.Close
End Sub
</script>
</head>
<script language="vbscript">
Option Explicit
' This is the Sub that opens external files and reads in the contents.
' In this way, you can have separate files for data and libraries of functions
Sub Include(yourFile)
Dim oFSO, oFileBeingReadIn ' define Objects
Dim sFileContents ' define Strings
Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oFileBeingReadIn = oFSO.OpenTextFile("try.vbs", 1)
sFileContents = oFileBeingReadIn.ReadAll
oFileBeingReadIn.Close
ExecuteGlobal sFileContents
End Sub
' Here we call the Include Sub, then pass it the name of the file we want items from
Include "mySubLib"
</script>
<body>
<button onClick="test()">Refresh Message Encrypter-Decrypter</button>
</body>
</html>
</head>
</html>
<body>
<h1>Write File</h1>
<p>How to Write to a File.</p>
<textarea name="TextFile" id="TextFile" rows="20" cols="50"></textarea>
<input type="button" value="Submit" onclick="Submitarea">
</body>
<body>
</body>
</html>
The "permission denied" errors most likely occur because the file had already been opened. Open the file only when you actually want to write to it, and close it right away after you finished writing. Also, if you want to write the content of the text area to the file you need to actually write the content of the text area, not the string "Txtarea".
Change this:
Set objFile = objFSO.OpenTextFile(strFileName, 2, True)
Set objShell = CreateObject("WScript.Shell")
Sub Submitarea
sTxtarea = TextFile.Value
objfile.Write "Txtarea" & vbCrLf
MsgBox "Your text has been added to " & strFileName, 64, "Textarea Input"
End Sub
to this:
Set objShell = CreateObject("WScript.Shell")
Sub Submitarea
Set objFile = objFSO.OpenTextFile(strFileName, 2, True)
objfile.Write TextFile.Value
objFile.Close
MsgBox "Your text has been added to " & strFileName, 64, "Textarea Input"
End Sub
and the problem will disappear.
Change the second parameter of the OpenTextFile() method from 2 to 8 if you want to append to the output file rather than replace its content.
#ansgar wiechers edits and suggestions were all correct and resulted in the scripts functioning properly. see code above in question for accurate solution to the original question.
permissions denied were caused by an open handle on input.txt. using process tree i killed the handle and the file functions properly.
the suggestion posted by ansgar wiechers fixed the code which was another separate issue but the correct codes and information reguarding the original question are in the post. thank you.
Related
Hello I am trying to upload VBScript to filter out only data that has been changed. When I am using script as a Macro it works but when I am launching it via AAE it throws an
Error In Script 1024 Expected Statement.
enter image description here
Sub filtering()
Range("H3").AutoFilter Field:=8, Criteria1:="<>"
Range("Q3").AutoFilter Field:=17, Criteria1:="<>"
Range("P3").AutoFilter Field:=16, Criteria1:=">=" & Range("A1").Value
Operator:=xlAND Criteria2:="<=" & Range("A2").Value
End Sub
There are 2 approaches to solve this :
First:
Lets include the subroutine withing within the <script> tag
<script type="text/vbscript">
Sub filtering()
Range("H3").AutoFilter Field:=8, Criteria1:="<>"
Range("Q3").AutoFilter Field:=17, Criteria1:="<>"
Range("P3").AutoFilter Field:=16, Criteria1:=">=" & Range("A1").Value
Operator:=xlAND Criteria2:="<=" & Range("A2").Value
End Sub
</script>
Or ignore the Subroutines entirely and include the below snippet in the .vbs file in AAE
Range("H3").AutoFilter Field:=8, Criteria1:="<>"
Range("Q3").AutoFilter Field:=17, Criteria1:="<>"
Range("P3").AutoFilter Field:=16, Criteria1:=">=" & Range("A1").Value
Operator:=xlAND Criteria2:="<=" & Range("A2").Value
Second:
You can the add the script in as an Add-in button in the form of Ribbons
And in AAE you can instruct the button to click on the button by using the Object Cloning from the command library.
For example:
How the button looks like from Excel Ribbons
The Code module in the back end
If an input html element of type=file is used to select a file then that file cannot be deleted by the hta program.
This MVCE works but doesn't use the file dialog - you have to type the filename in manually:
<html>
<HEAD>
<SCRIPT Language="VBScript">
Sub Process
Set x = CreateObject("Scripting.FileSystemObject")
MsgBox "this will actually delete "& INIFile.Value
x.DeleteFile INIFile.Value
MsgBox "see? "& INIFile.Value &" is gone"
Set x = Nothing
End Sub
</SCRIPT>
</HEAD>
<body id='body'>
<input type="text" name="INIFile" >
<input type="button" value="Go!" onClick="Process" >
</body>
</html>
But this MVCE doesn't work - the file is not deleted; just deferred until the program exits:
<html>
<HEAD>
<SCRIPT Language="VBScript">
Sub Process
Set x = CreateObject("Scripting.FileSystemObject")
MsgBox "try to manually delete "& INIFile.Value &" (and then undo it)"
x.DeleteFile INIFile.Value
MsgBox "now try to delete file "& INIFile.Value &" (now it can't be deleted until the app is closed)"
Set x = Nothing
End Sub
</SCRIPT>
</HEAD>
<body id='body'>
<input type="file" name="INIFile" >
<input type="button" value="Go!" onClick="Process" >
</body>
</html>
Somehow using a file type input html element makes it so that the file CAN be manually deleted from outside the program UNTIL the DeleteFile function is called. The DeleteFile function doesn't actually delete the file - it just deferrs the deletion until the hta program exits - at which point the file finally deletes itself.
I need to delete the file while the program is still running. Is there any way to use a file type input html element in an hta file and still delete the file while the hta program is running?
EDIT
My actual use case! In an attempt to produce a usable MVCE I didn't realize a solution would be found that doesn't work with my particular requirements.
The reason I am deleting the file is so that I can replace it with something else, so I need the file to disappear before the end of the function. Call window.location.reload() absolutely works but the file disappears at the end of the function.
What I am actually trying to do is something like this:
<HTML>
<HEAD>
<SCRIPT Language="VBScript">
Sub Process
Dim file: file = INIFile.Value
Call window.location.reload()
'backup the file to tempfile.tmp
'Now edit tempfile.tmp with all the changes and preview it
'then ask the user whether they are happy with the changes
'delete the original file
'and put the tempfile.tmp in its place
Dim x: Set x = CreateObject("Scripting.FileSystemObject")
x.CopyFile file,"tempfile.tmp"
x.DeleteFile file
MsgBox "why is "& file &" still there?"
x.MoveFile "tempfile.tmp",file ' this produces "file already exists"
Set x = Nothing
End Sub
</SCRIPT>
</HEAD>
<BODY id='body'>
<INPUT type="file" name="INIFile" onChange="Process">
</BODY>
</HTML>
Use a regular text input box
<input type="text" name="FileName" size="30">
Add a button to click to open the file
<input type="button" onClick="SelectFile" value="Browse...">
Add a file dialog object
<OBJECT id=Dlg classid="CLSID:3050F4E1-98B5-11CF-BB82-00AA00BDCE0B" width=0 height=0>
Add a sub to take the return value of this object and put it in your text box.
Sub SelectFile
FileName.value = ""
strStartPath = "C:\Test"
strFilter = "Text (*.txt;*.csv)| *.txt;*.csv|VBScript (*.vbs;*.vbc)|*.vbs;*.vbc|HTML (*.htm;*.html;*.hta)|*.htm;*.html;*.hta|All Files (*.*)|*.*|"
strCaption = "Select a File"
FileName.value = Dlg.openfiledlg(CStr(strStartPath), , CStr(strFilter), CStr(strCaption))
End Sub
The strStartPath, strFilter, and strCaption variables can be excluded or customized as needed.
FileName.value will contain the path to the file and it will not be locked.
Edit:
Here's the entire HTA, excluding code to delete the file (I have tested this with the delete code):
<html>
<HEAD>
<HTA:APPLICATION
APPLICATIONNAME="Select File"
ID="SelectFileApplication"
VERSION="1.0"/>
<SCRIPT Language="VBScript">
Sub SelectFile
FileName.value = ""
strStartPath = "C:\Test"
strFilter = "Text (*.txt;*.csv)| *.txt;*.csv|VBScript (*.vbs;*.vbc)|*.vbs;*.vbc|HTML (*.htm;*.html;*.hta)|*.htm;*.html;*.hta|All Files (*.*)|*.*|"
strCaption = "Select a File"
FileName.value = Dlg.openfiledlg(CStr(strStartPath), , CStr(strFilter), CStr(strCaption))
'The file at FileName.value can be deleted at this point.
End Sub
</SCRIPT>
</HEAD>
<body id="body">
<input type="text" name="FileName" size="30">
<input type="button" onClick="SelectFile" value="Browse...">
<OBJECT id=Dlg classid="CLSID:3050F4E1-98B5-11CF-BB82-00AA00BDCE0B" width=0 height=0>
</body>
</html>
Update: Based on feedback from OP
Well have now tested this approach myself with similar results to the OP so thought I'd investigate further.
The File Handle appears to be held for the life of the page, tried the following
Encapsulating in a <form> then calling Reset() method
Clearing the <input> value attribute and using a variable to hold the file path.
Neither work but while tested realised that if you refresh the page inside the HTA the file deletion occurs, this means that forcing the page to reload should work, so ended up doing just that.
<html>
<HEAD>
<HTA:APPLICATION ID="oHTA"
APPLICATIONNAME="myApp"
BORDER="thin"
BORDERSTYLE="normal"
CAPTION="yes"
ICON=""
MAXIMIZEBUTTON="yes"
MINIMIZEBUTTON="yes"
SHOWINTASKBAR="no"
SINGLEINSTANCE="no"
SYSMENU="yes"
VERSION="1.0"
WINDOWSTATE="normal"/>
<SCRIPT Language="VBScript">
Sub Process
Set x = CreateObject("Scripting.FileSystemObject")
MsgBox "try to manually delete "& INIFile.Value &" (and then undo it)"
x.DeleteFile INIFile.Value
'Reload page
Call window.location.reload()
End Sub
</SCRIPT>
</HEAD>
<body id='body'>
<input type="file" name="INIFile" >
<input type="button" value="Go!" onClick="Process" >
</body>
</html>
which works, obviously this isn't ideal for capturing the fact the file has been deleted as the page is reloaded but the OP hasn't gone into detail as to their requirement.
You could also make the the Go button a <input type="submit"> and use the OnSubmit event to call Process() which might be cleaner approach then calling window.location.reload().
Further Update:
From testing with multiple files have noticed that once another file is selected using the <input type="file"> the previous file is deleted as the handle is released and given to the newly selected file.
I wonder if cloning the <input type="file"> element and removing the previous one will have the same effect and avoid needing to reload the page?
Update: Have since tested and does still hold on to the File Handle
The <input type="file"> is designed for uploading files so it makes sense that once you have selected a file the HTA holds a handle open to it. That being said, there is no reason why you have to call the value of INIFile directly instead store it in a variable (after all it's just a string) and then clear the Value attribute of the <input>.
Sub Process
Dim x: Set x = CreateObject("Scripting.FileSystemObject")
'Get file path from INPUT
Dim file: file = INIFile.Value
'Reset file INPUT
INIFile.Value = ""
MsgBox "this will actually delete "& file
x.DeleteFile file
MsgBox "see? "& file &" is gone"
Set x = Nothing
End Sub
Useful Links
How do you set file input to nothing with JavaScript or HTML?
I want to use VBScript to click a button that reads “Add Document” in the GUI of an application that runs in Internet Explorer. The problem is there is no “id”, “name” , or “class” element in the source code (see below) to use as a reference in the script.
Source Code:
<TD>
<INPUT type="button" value="Add Document" onclick="addFileUploadBox()">
</TD>
My code is below and works for elements that have source code ids. Also included are some failed attempts to click the button in question based on my googling but I cant get to work. I'm new to this and any help would be appreciated - any suggestions to fix?
My Code:
Dim objIE
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = True
objIE.Navigate "http://sharemxxxx.xxxxx.com/xxxImport/import.aspx"
While objIE.Busy
WScript.Sleep 100
Wend
objIE.Document.getElementById("txtReferenceNum").value = "15226002"
objIE.Document.getElementById("ddlCategory").value = "05"
objIE.Document.getElementById("btnRetrieve").click
' ABOVE CODE WORKS
' NOT WORKING #1 - DOES NOTHING - NO ERROR
'===========================================
objIE.Document.getElementByType("btn").Value="Add Document"
For Each btn In objIE.Document.getElementsByTagName("input")
If btn.Value="Add Document"Then btn.Click()
Next
' NOT WORKING #2 - DOES NOTHING - NO ERROR
'===========================================
For Each Button In objIE.Document.getElementsByTagName("input")
If Button.Value="Add Document"Then Button.Click()
Next
' NOT WORKING #3 - DOES NOTHING - NO ERROR
'===========================================
Set oInputs = objIE.Document.getElementsByTagName("input")
For Each elm In oInputs
If elm.Value = "Add Document" Then
elm.Click
Exit For
End If
Next
' NOT WORKING #4 - Show Empty Msg Box
'===========================================
set objButtons = objIE.document.getElementsByTagName("input")
for each objButton in objButtons
strText = objButton.innerhtml
msgbox strText
if (strText = "Add Document") then
msgbox "found the button!"
objButton.click
exit for
end if
next
You probably don't even need to find the element. It looks like the button just calls a JavaScript function. So you can use the execScript() function to run it.
For example:
objIE.Document.parentWindow.execScript "addFileUploadBox();", "javascript"
I have the a button on my hta file that when i click on will trigger a batch file to run. I want user to input the computer name into a text box and use it at the below psexec command which requires the computer name. Any recommendations would greatly appreciated.
<script language="VBScript">
Sub InstallVNC
dim shell
set shell=createobject("wscript.shell")
shell.run "psexec -u domain01\username -p password \\textbox1.value -c \\doamin\SHARE\SOFTWARE\install_program.bat"
End Sub
<body bgcolor="buttonface">
<p><font face="verdana" color="red">Application Installer</font></p>
Please run as administrator. <p>
<form name="test">
<font>Computer Name:</font>
<input type="text" name="textbox1" id="textbox1">
</form>
<input id=runbutton class="button" type="button" value="Install VNC" name="db_button" onClick="installvnc"><p>
</body>
</html>
You need to handle the input string differently. Something like this:
Sub InstallVNC
dim shell
dim strInput
dim shell_parameter
strInput = textbox1.value
shell_parameter = "psexec -u domain01\username -p password \\" & strInput & " -c \\doamin\SHARE\SOFTWARE\install_program.bat"
set shell=createobject("wscript.shell")
shell.run shell_parameter
End Sub
About getting the user input: I haven't used <form> in hta -- a dialog box has always been simpler. I wonder if that would get you past the problem. This code would be invoked when the button is pressed:
Dim strDialogPrompt, strDialogTitle, strDialogDefault
strDialogTitle = "File location"
strDialogPrompt = "Enter location of file to install." _
& vbCrLf & "(You must run this as Administrator.)"
strDialogDefault = "Z:\The_Usual_Path"
strInput = InputBox(strDialogPrompt, strDialogTitle, strDialogDefault, 150, 150)
Basic DOM manipulation:
Dim computerName
computerName = document.getElementById("textbox1").value
For more information, you can consult pretty much any DOM reference (e.g., https://developer.mozilla.org/en-US/docs/DOM)
I'm displaying an image like this:
<img src='counter.asp'>
counter.asp is doing a hit-counter do determine how often the image was displayed (I'll replace it with a modrewrite URL).
The problem: in the counter.asp script I need to send the actual .jpg image to the browser. How could this be done? I suppose I need to load the image through FSO, and then send it using Response.BinaryWrite - any ideas?
To read and output binary you can simply use the ADODB.Stream object.
See the ADODB.Stream MSDN Library:
http://msdn.microsoft.com/en-us/library/ms675032(VS.85).aspx
Here's an example I found from Experts Exchange as well:
Function ReadBinaryFile(strFileName)
on error resume next
Set oStream = Server.CreateObject("ADODB.Stream")
if Err.Number <> 0 then
ReadBinaryFile=Err.Description
Err.Clear
exit function
end if
oStream.Type = 1
oStream.Open
oStream.LoadFromFile strFileName
if Err.Number<>0 then
ReadBinaryFile=Err.Description
Err.Clear
exit function
end if
ReadBinaryFile=oStream.Read
oStream.Close
set oStream = nothing
if Err.Number<>0 then ReadBinaryFile=Err.Description
End Function
you can just redirect your counter.asp to the image you want..
<%
response.redirect("/virtual/path/to/yourimage.jpg")
%>
FSO cannot load a binary file, only text. You will need to use a 3th party component.