VBScript will not run .exe silently

I have an SAP GUI patch (.exe) that I need to run silently on startup for all of our users. When I call it with VBS (something like the below), then it does not run silently. Even if I add the ,1,True to the end.

I've seen that when using a batch file with the /silent switch, the .exe installs silently and runs fine. However, if I call that batch file with the VBS, then it does not install (the batch file does run, however, as I've put in a line to write text to a log file when it runs).

Any ideas?

test.vbs
--------------------------
Dim Patch
Dim WshShell
 
Set WshShell = WScript.CreateObject("WScript.Shell")
Patch = WshShell.Run ("S:\SAP\gui710_16-10002995.exe /quiet /norestart")
----------------------------

sap-batch.bat
----------------------------
@echo off
IF EXIST "c:\Program Files\SAP\FrontEnd\SAPgui\saptrace.dll" exit
CLS
@echo Please wait for this script to run before running SAP >> c:\sap-patch-log.txt 2>>&1
gui710_16-10002995.exe /silent
@echo on
@echo You can now close this window and Run SAP
---------------------------
LVL 1
FloydTheDuckAsked:
Who is Participating?

[Product update] Infrastructure Analysis Tool is now available with Business Accounts.Learn More

x
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

Kyle AbrahamsSenior .Net DeveloperCommented:
0
TakedaTCommented:
If you used the /silent switch in the batch, why didnt you try it in the vbs code?  Try this.
Dim Patch
Dim WshShell
 
Set WshShell = WScript.CreateObject("WScript.Shell")
Patch = WshShell.Run ("S:\SAP\gui710_16-10002995.exe /silent",0,True)

Open in new window

0
FloydTheDuckAuthor Commented:
Sorry, I'm backtracking now. i remember why I went to a batch file.... I had trouble getting the vbs to check if a file exists first. I'll lookup more info on EE to see how to do that.

I guess I was just overthinking. Thanks to both.
0
Rowby Goren Makes an Impact on Screen and Online

Learn about longtime user Rowby Goren and his great contributions to the site. We explore his method for posing questions that are likely to yield a solution, and take a look at how his career transformed from a Hollywood writer to a website entrepreneur.

Kyle AbrahamsSenior .Net DeveloperCommented:
0
Daz_1234Commented:
Hi FloydTheDuck,

Please try the script below.  It is all in vbs.  It tests for the dll, then tests for the install exe, and executes the install silently.

It also logs to the c:\sap-patch-log.txt file.

Let me know how it goes.

Regards,
Daz.


Dim wshShell, fso, strLogFile, ts, strCmd, strCmdLine, ret

Set wshShell = CreateObject("WScript.Shell")
Set fso = CreateObject("Scripting.FileSystemObject")

strLogFile = "c:\sap-patch-log.txt"
strCmd = "S:\SAP\gui710_16-10002995.exe"
strCmdLine = strCmd & " /silent"

Set ts = fso.OpenTextFile(strLogFile, 8, True)  '# Will append to the end of the logfile

ts.WriteLine Now() & " - Executing SAP install Script"

'# Test for saptrace.dll
If fso.FileExists("c:\Program Files\SAP\FrontEnd\SAPgui\saptrace.dll") Then
    ts.WriteLine Now() & " - Install aborted: c:\Program Files\SAP\FrontEnd\SAPgui\saptrace.dll found."
    ts.Close
    WScript.Quit(1)
End If

'# saptrace test passed, start install

ts.WriteLine Now() & " - Calling command: " & strCmdLine

If Not fso.FileExists(strCmd) Then
    ts.WriteLine Now() & " - Install aborted: '" & strCmd & "' file not found."
    ts.Close
    WScript.Quit(1)
End If

ret = wshShell.Run(strCmdLine, 0, True)

ts.WriteLine Now() & " - Install command ended, returned: " & ret
ts.WriteLine Now() & " - End of Install Script."

Open in new window

0
FloydTheDuckAuthor Commented:
Daz, as that's a lot of code, I may want to put it in a separate script than my logon script and just call the script. What's the best way to call other vbscripts?
0
Daz_1234Commented:
Hi FloydTheDuck,

You can put a line in like this:

wshShell.Run "WScript.exe ""S:\Path\To\The\Script\InstallSAP.vbs""", 1, True

... or ...

you can include it in your main script in a sub.  Add the Sub to the end of your script and just call it with the
   InstallSAP()
line - see below.

Regards,
Daz.

'# Lots of login script stuff here


InstallSAP()

'# More login script stuff here


Sub InstallSAP()
    Dim wshShell, fso, strLogFile, ts, strCmd, strCmdLine, ret

    Set wshShell = CreateObject("WScript.Shell")
    Set fso = CreateObject("Scripting.FileSystemObject")

    strLogFile = "c:\sap-patch-log.txt"
    strCmd = "S:\SAP\gui710_16-10002995.exe"
    strCmdLine = strCmd & " /silent"

    Set ts = fso.OpenTextFile(strLogFile, 8, True)  '# Will append to the end of the logfile

    ts.WriteLine Now() & " - Executing SAP install Script"

    '# Test for saptrace.dll
    If fso.FileExists("c:\Program Files\SAP\FrontEnd\SAPgui\saptrace.dll") Then
        ts.WriteLine Now() & " - Install aborted: c:\Program Files\SAP\FrontEnd\SAPgui\saptrace.dll found."
        ts.Close
        Exit Sub
    End If

    '# saptrace test passed, start install

    ts.WriteLine Now() & " - Calling command: " & strCmdLine

    If Not fso.FileExists(strCmd) Then
        ts.WriteLine Now() & " - Install aborted: '" & strCmd & "' file not found."
        ts.Close
        Exit Sub
    End If

    ret = wshShell.Run(strCmdLine, 0, True)

    ts.WriteLine Now() & " - Install command ended, returned: " & ret
    ts.WriteLine Now() & " - End of Install Script."
    ts.Close
End Sub

Open in new window

0
Daz_1234Commented:
... Or if you want to call it from a .bat / .cmd batch script:


REM Batchy stuff

WScript.exe "S:\Path\To\The\Script\InstallSAP.vbs"

REM more batchy stuff
0
FloydTheDuckAuthor Commented:
Daz, in installsap.vbs, if it installs I'd like to echo to the user not to run SAP until they receive a "Finished" message. Where do I need to put the WScript.Echo? I obviously don't want it to come up if the install does not run.
0
FloydTheDuckAuthor Commented:
Also, both ways running the .exe thru vbs do not run silently.
Both with Daz's method:
---------------------------------
strCmd = "S:\SAP\gui710_16-10002995.exe"
strCmdLine = strCmd & " /silent"
---------------------------------

As well as the other by Takeda
---------------------------
Dim Patch
Dim WshShell
 
Set WshShell = WScript.CreateObject("WScript.Shell")
Patch = WshShell.Run ("S:\SAP\gui710_16-10002995.exe /silent",0,True)
---------------------------


I've also tried running it this way:
-------------------------
    WSHShell.Run chr(34) & "s:\SAP\gui710_16-10002995.exe" & chr(34) & " /silent",0,true
-------------------------
But this does not work either, the user gets prompted every time "Are you sure you want to run this file?"
0
Daz_1234Commented:
Hi

Please see the script below.  There is a significant change in the way I call the installation.  I am now using the Exec method to call the installation instead of the Run method.  This enables me to call the installation exe, without halting the script, but still retain a link to the installation so I can tell when it finishes and return an exit code.

As you can see I can also create messages for the user using MsgBox which you can edit.  You may want to add logic to check for a non-zero exit code but I do not know what exit codes the SAP installation can return.

Please note that the script will execute the installation, display a message and then pause until OK is clicked.  This will not hold up the installation of SAP though.

Regards,
Daz.
'# Lots of login script stuff here


InstallSAP()

'# More login script stuff here


Sub InstallSAP()
    Dim wshShell, oExec, fso, strLogFile, ts, strCmd, strCmdLine

    Set wshShell = CreateObject("WScript.Shell")
    Set fso = CreateObject("Scripting.FileSystemObject")

    strLogFile = "c:\sap-patch-log.txt"
    strCmd = "c:\WINDOWS\system32\calc.exe" '"S:\SAP\gui710_16-10002995.exe"
    strCmdLine = strCmd & " /silent"

    Set ts = fso.OpenTextFile(strLogFile, 8, True)  '# Will append to the end of the logfile

    ts.WriteLine Now() & " - Executing SAP install Script"

    '# Test for saptrace.dll
    If fso.FileExists("c:\Program Files\SAP\FrontEnd\SAPgui\saptrace.dll") Then
        ts.WriteLine Now() & " - Install aborted: c:\Program Files\SAP\FrontEnd\SAPgui\saptrace.dll found."
        ts.Close
        Exit Sub
    End If

    '# saptrace test passed, start install

    ts.WriteLine Now() & " - Calling command: " & strCmdLine

    If Not fso.FileExists(strCmd) Then
        ts.WriteLine Now() & " - Install aborted: '" & strCmd & "' file not found."
        ts.Close
        Exit Sub
    End If

    Set oExec = wshShell.Exec (strCmdLine)  '# Initiates installation but does not wait

    MsgBox "SAP is now installing.  Please do not attempt to Run SAP until you get an 'installation complete' Message.", vbInformation + vbSystemModal, "SAP Installation"
    Do While oExec.Status = 0
        '# Loop forever now until SAP installation (gui710_16-10002995.exe) is finished.
        WScript.Sleep 1000   '# wait 1 second before looping to reduce CPU load.
    Loop

    MsgBox "SAP installation process complete.", vbInformation + vbSystemModal, "SAP Installation"

    ts.WriteLine Now() & " - Install command ended, returned: " & oExec.ExitCode
    ts.WriteLine Now() & " - End of Install Script."
    ts.Close
End Sub

Open in new window

0
Daz_1234Commented:
Hi,

If you are getting "Are you sure you want to run this file?", I think that this is the Windows security kicking in because the gui710_16-10002995.exe is on a network drive.

1. If you manually double the S:\SAP\gui710_16-10002995.exe file do you get the same message?
2. If you copy gui710_16-10002995.exe to the C drive and double click it, do you still get the same message?


Regards,
Daz
0
FloydTheDuckAuthor Commented:
I rewrote the code to call a .bat file, which runs the file without getting the "Are you sure you want to run this file?" prompt.
The code is below, for the InstallSAP.vbs

I do have a problem with calling the InstallSAP.vbs from the logon.vbs, though. It works most of the time, but I just tested it with another user and it defaulted to their home directory (Q:\). So even though logon.vbs and InstallSAP.vbs are in the same directory (\\server\netlogon), it tried to call Q:\InstallSAP.vbs

Any idea why this would be? Is there anything wrong with calling the .bat file to run the script?
Dim wshShell, objFSO, strLogFile, ts, strCmd, strCmdLine, ret
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set WshShell = WScript.CreateObject("WScript.Shell")
sBatFile = "SAP-Patch.bat"

If Not objFSO.FileExists(sBatfile) Then
    MsgBox "There was a problem attempting to install your SAP Patch. Please contact the HelpDesk."
    WScript.Quit
End If

If objFSO.FileExists("c:\Program Files\SAP\FrontEnd\SAPgui\saptrace.dll") Then
    WScript.Quit(1)
Else
    WScript.Echo "Please wait while a SAP Patch is installed. Another message will popup when finished."
    wshShell.Run sBatFile, 0, True
    WScript.Echo "You may now run SAP. Thank you for your patience."
End If

Open in new window

0
FloydTheDuckAuthor Commented:
Daz, in reply to your other comment. I get the prompt "Are you sure you want to run this file?" whether it is on the network or my local drive.
0
Daz_1234Commented:
Hi,

I have amended my sub to call the batch file.  See below.

If you want the install sap script in a different script then you need to change the way it is called.

If your logon script is .bat / .cmd then use this method:

REM =====
REM now calling InstallSAP.vbs from this same folder
~dp0InstallSAP.vbs

REM =====

If your logon script is .vbs then use this:

'# Identify current directory:
strCurrDir = Replace(WScript.ScriptFullName, WScript.ScriptName, "")
wshShell.Run "WScript.exe """ & strCurrDir & "InstallSAP.vbs""", 0, True
InstallSAP()

Sub InstallSAP()
    Dim wshShell, oExec, fso, strCurrDir, strLogFile, ts, strCmd

    Set wshShell = CreateObject("WScript.Shell")
    Set fso = CreateObject("Scripting.FileSystemObject")
    strCurrDir = Replace(WScript.ScriptFullName, WScript.ScriptName, "")   '# Find current folder

    strLogFile = "c:\sap-patch-log.txt"
    strCmd = strCurrDir & "SAP-Patch.bat"    '# full path to current folder and batch file.

    Set ts = fso.OpenTextFile(strLogFile, 8, True)  '# Will append to the end of the logfile

    ts.WriteLine Now() & " - Executing SAP install Script"

    '# Test for saptrace.dll
    If fso.FileExists("c:\Program Files\SAP\FrontEnd\SAPgui\saptrace.dll") Then
        ts.WriteLine Now() & " - Install aborted: c:\Program Files\SAP\FrontEnd\SAPgui\saptrace.dll found."
        ts.Close
        Exit Sub
    End If

    '# saptrace test passed, start install

    ts.WriteLine Now() & " - Calling command: " & strCmd

    If Not fso.FileExists(strCmd) Then
        ts.WriteLine Now() & " - Install aborted: '" & strCmd & "' file not found."
        ts.Close
        Exit Sub
    End If

    Set oExec = wshShell.Exec (strCmd)  '# Initiates installation but does not wait

    MsgBox "SAP is now installing.  Please do not attempt to Run SAP until you get an 'installation complete' Message.", vbInformation + vbSystemModal, "SAP Installation"
    Do While oExec.Status = 0
        '# Loop forever now until SAP installation (SAP-Patch.bat) is finished.
        WScript.Sleep 1000   '# wait 1 second before looping to reduce CPU load.
    Loop

    MsgBox "SAP installation complete.  You may now use SAP.", vbInformation + vbSystemModal, "SAP Installation"

    ts.WriteLine Now() & " - Install command ended, returned: " & oExec.ExitCode
    ts.WriteLine Now() & " - End of Install Script."
    ts.Close
End Sub

Open in new window

0
Daz_1234Commented:
[I'll be unavailable from now I'm afraid.  I'll check back over the weekend, have a good one!]
0
FloydTheDuckAuthor Commented:
This appears to be working. I'm doing some final testing tomorrow and will let you know if I have any problems. Thanks so much!
0
FloydTheDuckAuthor Commented:
Daz, with your script there is a command window that opens. Where can I specify to silence this?
0
Daz_1234Commented:
Hi, I see you what you mean: when I changed it from calling the exe to calling the batch file, this had an unfortunate side effect.

The Exec method used to call it does not wait which means we can call a messagebox but it wont hold up the install.  The downside is that when using the Exec method to call a batch file (or any command-line command) it will show a command window.

So I have half reverted to a previous version.  This one does not use the exec method, but it does mean that  the update will not start until the user clicks OK on the 'SAP is about to update' message box.

But this way there will be no unprofessional command window.

Let me know what you think.

Regards,
Daz.

InstallSAP()

Sub InstallSAP()
    Dim wshShell, fso, strCurrDir, strLogFile, ts, strCmd, ret

    Set wshShell = CreateObject("WScript.Shell")
    Set fso = CreateObject("Scripting.FileSystemObject")
    strCurrDir = Replace(WScript.ScriptFullName, WScript.ScriptName, "")   '# Find current folder

    strLogFile = "c:\sap-patch-log.txt"
    strCmd = strCurrDir & "SAP-Patch.bat"    '# full path to current folder and batch file.

    Set ts = fso.OpenTextFile(strLogFile, 8, True)  '# Will append to the end of the logfile

    ts.WriteLine Now() & " - Executing SAP install Script"

    '# Test for saptrace.dll
    If fso.FileExists("c:\Program Files\SAP\FrontEnd\SAPgui\saptrace.dll") Then
        ts.WriteLine Now() & " - Install aborted: c:\Program Files\SAP\FrontEnd\SAPgui\saptrace.dll found."
        ts.Close
        Exit Sub
    End If

    '# saptrace test passed, start install

    ts.WriteLine Now() & " - Calling command: " & strCmd

    If Not fso.FileExists(strCmd) Then
        ts.WriteLine Now() & " - Install aborted: '" & strCmd & "' file not found."
        ts.Close
        Exit Sub
    End If

    MsgBox "SAP is about to update.  Please do not attempt to Run SAP until you get an 'installation complete' Message.", vbInformation + vbSystemModal, "SAP Update"

    ret = wshShell.Run(strCmd, 0, True)

    ts.WriteLine Now() & " - Install command ended, returned: " & ret
    ts.WriteLine Now() & " - End of Install Script."
    ts.Close

    MsgBox "SAP Update process complete.  You may now use SAP.", vbInformation + vbSystemModal, "SAP Update"
End Sub

Open in new window

0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
FloydTheDuckAuthor Commented:
That works great! Thanks Daz!
Not only did you help me solve this problem, but I learned a lot about VBS from all the different ways we attempted this. Thanks again!
0
Daz_1234Commented:
You're welcome, glad it worked for you.

Daz.
0
FloydTheDuckAuthor Commented:
Very great help! Thanks so much!
0
FloydTheDuckAuthor Commented:
Daz, i know this is a closed case, but I wanted to see if you could tell me how to make the installation unattended (user doesn't have to click anything) but is NOT silent (so they can watch it work). I have too many people that completely disregard the "DO NOT USE SAP" message and they use SAP, so I want them to see the install and hopefully that will help.
0
Daz_1234Commented:
Hi

Deleting or commenting out the line (line 34 above):

sgBox "SAP is about to update.  Please do not attempt to Run SAP until you get an 'installation complete' Message.", vbInformation + vbSystemModal, "SAP Update"

... will stop the click OK messagebox, and if you change this ....

ret = wshShell.Run(strCmd, 0, True)

... to this (line 36 above) ...

ret = wshShell.Run(strCmd, 1, True)

... it will make the command window visible, but the patch install will still be invisible because of the /silent switch in the batch file on the gui710_16-10002995.exe command.

I'm afraid I don't know if it is possible to run the patch automated but not silent.  If you run the exe manually with no /silent switch, does it require you to click Ok or anything? does it show any progress?

Daz.
0
FloydTheDuckAuthor Commented:
You have to click Next and "Agree" to continue with the install, then you have a progress bar after which you click "Finish."
0
Daz_1234Commented:
I've done a bit of searching and I can't find a command-line switch for the SAP update that will allow it to run non-silently but automated.

Therefore the only other suggestion I can make is that you allow the black command window to show, and in the SAP-Patch.bat batch file put a line before the gui710_16-10002995.exe / silent to say something like:

@echo    ...  Now installing SAP update, please wait for completion before running SAP ...

I know it wont be very pretty, but otherwise you are looking at creating a GUI of your own.

Daz.
0
FloydTheDuckAuthor Commented:
That's alright. Thanks Daz!
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
VB Script

From novice to tech pro — start learning today.