Long story short, I print shipping labels at my job through a proprietary program that runs through IE. A common shipper is Caterpillar Global Mining, so I made a script to enter that field for me.
Set wshShell = WScript.CreateObject("WScript.Shell")
WScript.Sleep 100
wshShell.AppActivate ("PRINT LABEL")
WScript.Sleep 100
wshShell.SendKeys "caterpillar global mining"
I put the cursor in the correct field, hit the Ctrl+Alt+A to run the script, and wham! I don't have to type the company's name 100 times. The problem is, it only works when I enter the PID instead of the title (for example, 1111 instead of "PRINT LABEL"). If I use the title in the script, it will bring focus to IE, but lose the cursor position. Using the PID is ok by me, I'm just curious as to why this happens.
UPDATE: after playing around some more I've noticed that there are 2 processes for IE. If I enter the other process PID the script reacts the same way as when I use the title. I am now even more confused. I feel like there is a simple answer, I just don't see it.
For using the title the string must match the beginning of the window title. Also, you will get the first match, so you need to make the string specific enough. The PID is by design and definition unique, so you don't run into these problems when using a PID in AppActivate.
Related
I am trying to read input interactively from a command prompt using VBScript, But I can't seem to read the data using readLine() in order to later send a reply.
Here's the code I have tried:
set OBJECT=WScript.CreateObject("WScript.Shell")
For i=1 To 500
If i=450 Then Exit For
OBJECT.SendKeys "00LI002LE99{ENTER}"
WScript.sleep 2000
dim input=ReadLine()
If input="LI002LE99" Then OBJECT.SendKeys "OK{ENTER}"
OBJECT.SendKeys "00LI002LE00{ENTER}"
WScript.sleep 2000
Next
The idea with this code is that if I were to send the command 00LI002LE99 on the command line, I want to send a console reply of LI002LE99. How can I get my script to read the data using the readline() command and then send the appropriate response?
I'm not 100% sure why you would want to do this, but there are a few problems with your code:
I'd recommend avoiding using the name OBJECT for variables.
You can't use dim like that in vbscript. You have to split it out into multiple instructions. What language do you normally use?
The way you are trying to use Readline() just won't work.
Here's a working example of your script, but be aware that if you move focus away from the the command window, strange things may happen! (eg: the send keys instruction will output the results to whichever window has the current focus - which I would imagine is not the desired outcome, if you are tabbing between windows or something):
Option Explicit
Dim shell, i, input
set shell=WScript.CreateObject("WScript.Shell")
For i=1 To 500
If i=450 Then Exit For
shell.SendKeys "00LI002LE99{ENTER}"
WScript.sleep 2000
input = WScript.StdIn.ReadLine()
If input="00LI002LE99" Then shell.SendKeys "OK{ENTER}"
shell.SendKeys "00LI002LE00{ENTER}"
WScript.sleep 2000
Next
Best of luck. Again, not entirely sure what you're doing here :)
FYI: The Wscript.StdIn.ReadLine() is going to be a little hit and miss.
If system locks every 5 minutes, what VB Scripting method is used to avoid system locking every 5 minutes?
Save this file in the format of .vbs
Change the Sleep Time 400 based on your requirement.
Set wshShell =wscript.CreateObject("WScript.Shell")
do
wscript.sleep 400
wshshell.sendkeys "{SCROLLLOCK}"
wscript.sleep 400
loop
Perhaps, WScript.SendKeys could help:
msdn
Something like double-ScrollLock, I guess?
PS. You'll need to put that in a loop with a sleep, of course.
The simplest and easiest way is to open windows media player and run the supplied Wildlife in HD video in repeat mode and then minimize it.
Problem solved, it won't allow the system to get lock automatically. No need for VBS.
Another option is to use small utility called Caffeine. Just download, extract and double click the .exe to run. It will run in background and will do the trick for you.
I am trying to read input interactively from a command prompt using VBScript, But I can't seem to read the data using readLine() in order to later send a reply.
Here's the code I have tried:
set OBJECT=WScript.CreateObject("WScript.Shell")
For i=1 To 500
If i=450 Then Exit For
OBJECT.SendKeys "00LI002LE99{ENTER}"
WScript.sleep 2000
dim input=ReadLine()
If input="LI002LE99" Then OBJECT.SendKeys "OK{ENTER}"
OBJECT.SendKeys "00LI002LE00{ENTER}"
WScript.sleep 2000
Next
The idea with this code is that if I were to send the command 00LI002LE99 on the command line, I want to send a console reply of LI002LE99. How can I get my script to read the data using the readline() command and then send the appropriate response?
I'm not 100% sure why you would want to do this, but there are a few problems with your code:
I'd recommend avoiding using the name OBJECT for variables.
You can't use dim like that in vbscript. You have to split it out into multiple instructions. What language do you normally use?
The way you are trying to use Readline() just won't work.
Here's a working example of your script, but be aware that if you move focus away from the the command window, strange things may happen! (eg: the send keys instruction will output the results to whichever window has the current focus - which I would imagine is not the desired outcome, if you are tabbing between windows or something):
Option Explicit
Dim shell, i, input
set shell=WScript.CreateObject("WScript.Shell")
For i=1 To 500
If i=450 Then Exit For
shell.SendKeys "00LI002LE99{ENTER}"
WScript.sleep 2000
input = WScript.StdIn.ReadLine()
If input="00LI002LE99" Then shell.SendKeys "OK{ENTER}"
shell.SendKeys "00LI002LE00{ENTER}"
WScript.sleep 2000
Next
Best of luck. Again, not entirely sure what you're doing here :)
FYI: The Wscript.StdIn.ReadLine() is going to be a little hit and miss.
I have a VBScript I am working on that uses another object.
Sometimes that Object will get stuck. My VBScript code will hang on that line until it's "done". When it times out, I want to send the .Close command to the Object before the VBScript closes.
How can I tell when my VBScript times out?
I know that I can put WScript.Timeout = 60
Maybe something like..
WScript.Timeout = 5
do while true
loop
sub WScript_timeout()
msgbox("OK")
end sub
By setting the Timeout property you instruct the interpreter to automatically terminate the script when the timer expires. This is the same as running the interpreter with the option //T:xx and can't be caught/handled from within the script. What you want requires the ability to run code asynchronously, and VBScript doesn't really support that.
The real answer (to the question "How can I tell when my VBScript times out?") is that you can't. In common with almost all scripts, if VBScript stops running (because it's timed-out) the running thread ceases to run, so it can't report its status.
But there is a solution. However, it requires some cunning.
If you run a batch script instead, wherever you use that script to launch a new batch script (e.g. batch_1.bat includes this line: CALL batch_2.bat), the 2nd script will run, but the 1st script will wait.
Processing of the 1st script sits and waits (at the CALL) until script 2 stops running: at that point, control is returned to script 1, which continues with any code following the CALL, code which might be used to report the fact that script 2 has ended -
CALL batch_2.bat
ECHO The batch_2.bat script has stopped running && cmd /k
There are ways of launching batch_2.bat without causing batch_1.bat to pause until the 2nd script has finished, but they are not relevent here.
Theoretically, a batch script doesn't support parallel processing. VBScript certainly doesn't either. But the foregoing technique shows one method whereby parallel processing can be achieved, after a fashion, in a batch script -- which makes it one-up on vbScript!
.
One way to be certain that vbScript will time out, if the script hangs, so that the script must either complete successfully or fail (so you are never left with a frozen script due to it "hanging"), is to use a WScript function in your .vbs file and set the Windows Script Host settings to time out after (say) 30 seconds -
A. Open the "Windows Script Host Settings" dialog box:
Go to: Start > Run
In the "Open" box, type: WSCRIPT
Click "OK".
B. Set a timeout, to occur whenever WSH runs:
Select the option: "Stop script after specified
number of seconds".
In the "seconds" box, type the time limit to be
applied to all scripts (default is 10 seconds).
.
Here's a function to find and show what the current WSH/WScript timeout setting is (and if it shows that this setting hasn't been set yet, set it) -
WScript.Echo("WSH timeout: " + WScript.Timeout);
.
The option //T:xx can't be used, because it's a CScript function, which doesn't work in WScript, so can't be used in a .vbs vbScript file.
.
If you could give my a hand that would be great?
I have a HTA file nothing to fancy its to install a few programs one by one
I have been reading in a few places on how to wait for installation to complete
then install the next program but none make sense to me for what i want, also
they are saying to use wscript.sleep that would be great but it doesnt work in a HTA right ?
I have firefox, utorrent, symantec antivirus, adobe reader, office 2003 (packaged with KEY already)
and a few others.
i want to find switches to install silently but thats not important if this code someone is willing to show me works...
I hope I make sense ?
If you can help me it would be great ?
Cheers Pavle.
You might find something useful in my answer (https://stackoverflow.com/a/3742182/128427) to this question: How to get an HTA to restart itself?
It uses a VBScript helper to wait for a process to end (the HTA itself) then restarts the HTA. You could modify the vbscript instead to wait for a specific process to end (one of your installers), then return control to the HTA which starts the next installer and calls the wait script again.
I don't think an HTA can call the WScript.Sleep routine, but there are the setTimeout and setInterval methods in HTA that call a routine after X seconds, or repeatedly call a routine after every X seconds until cancelled. You can use these to check periodically if a process is still running (using WMI Win32_Process as I show in my other answer).
To process a list of items like this, instead of using a loop to go through a list and pause after each item, you have a central state-machine routine that calls itself every so often to advance the system.
'!! extremely "pseudo" pseudo-code follows
sub StartSystem()
state = "next program"
list = list of programs to install
AdvanceSystem()
end sub
sub AdvanceSystem()
if state = "next program"
if more items in list
start next installer
remove from list (or increment an index)
set state to "check program"
else
set state to "done"
if state = "check program"
use WMI to see if process is still running
if no
state = "next program"
if state <> "done"
setInterval(AdvanceSystem, 5000) ' call again in 5 seconds
end sub
' then somewhere in your HTA interface have a button to start things off
buttonClick = StartSystem()
Using an arrangement like this you may not even need to run a separate VBScript to check the process and sleep. Also, with this kind of incremental process, you can send output to a DIV somewhere so the user can see progress, whereas when processing things in a loop, output doesn't show up until the whole process has finished. After each pass through AdvanceSystem, the control returns to the HTA level and the system can update itself.
Let me know if you need a more specific example, I'll try to write something up.