• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 3197
  • Last Modified:

How to use different "shell" with Shell() in VB.net

I am working on a program that needs to call a 3rd party shell from my VB.NET code.  I have been trying to use the Shell() function but apparently the 3rd party shell I need to use doesn't work correctly when I call it from the default shell.  Is there a way in VB.NET I can either see the code for the built-in Shell() function so I can re-write it to use my other shell or call this other shell directly?

Here's what I'm trying to do, I am working on a program to work with CA Autosys 4.5 (a job scheduler) which creates jobs in Autosys when certain things happen.  I am doing this by creating a temporary file containing JIL script (the scripting language used by Autosys) with my VB.NET code.  Then I need to be able to do the command "jil.exe < tempfile.jil" from within the Autosys shell, which is called "initautosys.exe"  If I call the Autosys shell from Shell("initautosys.exe -i ACE -r jil.exe < tempfile.jil"), it works up to "initautosys.exe -i ACE -r jil.exe" but never gets the "< tempfile.jil".  CA tells me that I have to call initautosys.exe directly and not from the default shell.

So does anyone know a good way to handle this?  I could either write my own shell function (like maybe CAshell()) if I had a way to see how the regular Shell() function is written, or I could see if there was a way to run the Autosys shell directly.  Any idea???
0
MHC_bcraigh
Asked:
MHC_bcraigh
5 Solutions
 
Julian HansenCommented:
Can you not use the Windows CreateProcess API to do this?
0
 
cookreCommented:
See if it doesn't work putting a ^ in front of the <, to wit:
Shell("initautosys.exe -i ACE -r jil.exe ^< tempfile.jil"
0
 
cookreCommented:
The pipe and redirect characters are intercepted and processed  by the shell.  The ^ is the shell escape character that tells the shell to ignore any special meaning the following character may have.

0
What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

 
leckyCommented:
Hey  MHC_bcraigh

Try putting the command ("initautosys.exe -i ACE -r jil.exe < tempfile.jil")
in a batch file and executing it with the Shell...

Shell("c:\a.bat")

HTH
0
 
Bob LearnedCommented:
Shell in VB.NET:

<SecurityPermission(SecurityAction.Demand, UnmanagedCode:=True)> _
Public Shared Function Shell(ByVal Pathname As String, ByVal Optional Style As AppWinStyle = 2, ByVal Optional Wait As Boolean = False, ByVal Optional Timeout As Integer = -1) As Integer
      Dim num2 As Integer
      Dim startupinfo1 As New STARTUPINFO
      Dim process_information1 As New PROCESS_INFORMATION
      Try
            New UIPermission(UIPermissionWindow.AllWindows).Demand
      Catch exception1 As  Exception
            Throw exception1
      End Try
      If ((Style < AppWinStyle.Hide) OrElse (Style > CType(9, AppWinStyle))) Then
            Throw New ArgumentException(Utils.GetResourceString("Argument_InvalidValue1", "Style"))
      End If
      NativeMethods.GetStartupInfo(startupinfo1)
      startupinfo1.dwFlags = 1
      startupinfo1.wShowWindow = CType(Style, Short)
      Dim text2 As String = Nothing
      Dim text1 As String = Nothing
      Dim num1 As Integer = NativeMethods.CreateProcess(text2, Pathname, Nothing, Nothing, False, 32, IntPtr.Zero, text1, startupinfo1, process_information1)
      If (num1 = 0) Then
            Throw ExceptionUtils.VbMakeException(53)
      End If
      NativeMethods.CloseHandle(process_information1.hThread)
      If Wait Then
            num1 = NativeMethods.WaitForSingleObject(process_information1.hProcess, Timeout)
            If (num1 = 0) Then
                  num2 = 0
            Else
                  num2 = process_information1.dwProcessId
            End If
      Else
            NativeMethods.WaitForInputIdle(process_information1.hProcess, 10000)
            num2 = process_information1.dwProcessId
      End If
      NativeMethods.CloseHandle(process_information1.hProcess)
      Return num2
End Function

Bob
0
 
MHC_bcraighAuthor Commented:
Thanks for all of your suggestions.  I tried each and every one of them.  But after doing a great deal of research and re-programming, I've determined through Computer Associates Support ( and two other sources ) that the "initautosys" does not have the functionality to handle an interactive shell.  So even though I tried using the "^" to escape the "<" and many other things, this problem is due to Computer Associates not providing the functionality that common sense would tell you that is needed.  We paid A LOT of money for this system and were told that it would allow us to do anything we wanted to do with custom scripts and programs.  We can't.

I liked the suggestion to create a process like:

            Dim oCmd As New Process
            Dim ascmd As String = "C:\Progra~1\CA\UnicenterAutoSysJM.ACE\autosys\bin\initautosys.exe"
            Dim jilstr As String = "-i ACE -r " & """" & "C:\Progra~1\CA\UnicenterAutoSysJM.ACE\autosys\bin\jil.exe < " & mytempfile & """"

            oCmd.StartInfo.WorkingDirectory = workingdir
            oCmd.StartInfo.UseShellExecute = False  'used for debugging purposes
            oCmd.StartInfo.FileName = ascmd
            oCmd.StartInfo.Arguments = jilstr
            oCmd.EnterDebugMode()     'used for debugging purposes
            oCmd.Start()

but I got the same result as using Shell().

I'm going to abandon this idea since there doesn't appear to be a way around the limitations of Autosys without re-writing Autosys.  I am going to create all of my jobs in Autosys to be permanent jobs for now so I can at least get something working, then I will re-visit this at a later time and just write something to do what I thought Autosys should have been able to do.  Maybe we can sell the solution to other Autosys shops!?!?!  kidding.......
0

Featured Post

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Tackle projects and never again get stuck behind a technical roadblock.
Join Now