Hello community,

in the context of a discussion I developed and presented a complete launch sequence of SAP GUI Scripting in VBScript. But for the future it seems better to use PowerShell, for reasons which I have described here. Now the equivalent in PowerShell script language:

#-Begin-----------------------------------------------------------------

  #-Includes------------------------------------------------------------
    . "$PSScriptRoot\COM.ps1"

  #-Sub Main------------------------------------------------------------
    Function Main() {

      $OpenNewConnFlag = $false

      if (-Not (Get-Process saplogon -ErrorAction silentlycontinue)) {
        Start-Process "C:\Program Files (x86)\SAP\FrontEnd\SAPgui\saplogon.exe"
         do {
           Start-Sleep -Milliseconds 250
         } until(Get-Process | where {$_.mainWindowTitle -like "SAP Logon 740"})
      }
      $SapGuiAuto = Get-Object "SAPGUI"
      $application = Invoke-Method $SapGuiAuto "GetScriptingEngine"
      $connection = Get-Property $application "Children" @(0)
      if ($connection -eq $Null) {
        $OpenNewConnFlag = $true
        Invoke-Method $application "OpenConnectionByConnectionString" `
          @("/H/10.100.202.145/S/3263", $true) > $Null
        $connection = Get-Property $application "Children" @(0)
      }
      if ($application.Children().Count() -gt 1) {
        $connection = $connection[0]
      }
      $session = Get-Property $connection "Children" @(0)
      if ($connection.Children().Count() -gt 1) {
        $session = $session[0]
      }

      if ($OpenNewConnFlag -eq $true) {
        $ID = Invoke-Method $session "findById" @("wnd[0]/usr/txtRSYST-MANDT")
        Set-Property $ID "Text" @("001")
        $ID = Invoke-Method $session "findById" @("wnd[0]/usr/txtRSYST-BNAME")
        Set-Property $ID "Text" @("BCUSER")
        $ID = Invoke-Method $session "findById" @("wnd[0]/usr/pwdRSYST-BCODE")
        Set-Property $ID "Text" @("minisap")
        $ID = Invoke-Method $session "findById" @("wnd[0]/usr/txtRSYST-LANGU")
        Set-Property $ID "Text" @("EN")
        $ID = Invoke-Method $session "findById" @("wnd[0]")
        Invoke-Method $ID "sendVKey" @(0)
      }

      Free-Object $session
      Free-Object $connection
      Free-Object $application
      Free-Object $SapGuiAuto

    }

  #-Main----------------------------------------------------------------
    Main

#-End-------------------------------------------------------------------

Here now the facelifted COM include, which I introduced here:

#-Begin-----------------------------------------------------------------

  #-Load assembly-------------------------------------------------------
    [Reflection.Assembly]::LoadWithPartialName("Microsoft.VisualBasic") > $Null

  #-Function Create-Object----------------------------------------------
    Function Create-Object {
      param([String] $objectName)
      try {
        New-Object -ComObject $objectName
      }
      catch {
        [Void] [System.Windows.Forms.MessageBox]::Show(
          "Can't create object", "Important hint", 0)
      } 
    }

  #-Function Get-Object-------------------------------------------------
    Function Get-Object {
      param([String] $objectName)
      [Microsoft.VisualBasic.Interaction]::GetObject($objectName)
    }

  #-Sub Free-Object-----------------------------------------------------
    Function Free-Object {
      param([__ComObject] $object)
      [Void] [System.Runtime.Interopservices.Marshal]::ReleaseComObject($object)
    }

  #-Function Get-Property-----------------------------------------------
    function Get-Property {
      param([__ComObject] $object, [String] $propertyName)
      $objectType = [System.Type]::GetType($object)
      $objectType.InvokeMember($propertyName,
        "GetProperty", $NULL, $object, $NULL)
    }

  #-Sub Set-Property----------------------------------------------------
    function Set-Property {
      param([__ComObject] $object, [String] $propertyName,
        $propertyValue)
      $objectType = [System.Type]::GetType($object)
      [Void] $objectType.InvokeMember($propertyName,
        "SetProperty", $NULL, $object, $propertyValue)
    }

  #-Function Invoke-Method----------------------------------------------
    function Invoke-Method {
      param([__ComObject] $object, [String] $methodName,
        $methodParameters)
      $objectType = [System.Type]::GetType($object)
      $output = $objectType.InvokeMember($methodName,
        "InvokeMethod", $NULL, $object, $methodParameters)
      if ( $output ) { $output }
    }

#-End-------------------------------------------------------------------

Hint: This code is a different perspective from the solution here.

Enjoy it.

Cheers
Stefan

To report this post you need to login first.

Be the first to leave a comment

You must be Logged on to comment or reply to a post.

Leave a Reply