Technology Blogs by Members
Explore a vibrant mix of technical expertise, industry insights, and tech buzz in member blogs covering SAP products, technology, and events. Get in the mix!
cancel
Showing results for 
Search instead for 
Did you mean: 
stefan_schnell
Active Contributor
0 Kudos
Two and a half year ago I wrote about the possiblity how to use SAP GUI Scripting with Windows PowerShell. But this solution uses Microsoft Script Control engine and it is not clear how the future will bring. So I develop a solution which works with PowerShell without the Microsoft Script Control engine:
#-Begin-----------------------------------------------------------------

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

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

#-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 }
}

#-Main----------------------------------------------------------------
$SapGuiAuto = [microsoft.visualbasic.Interaction]::GetObject("SAPGUI")
$application = Invoke-Method $SapGuiAuto "GetScriptingEngine"
$connection = Get-Property $application "Children" @(0)
$session = Get-Property $connection "Children" @(0)

$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)

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

 

Hint: The wrapper functions are from Bill Stewart - thanks for that.

Here the equivalent code but with Microsoft Script Control engine:
#-Begin-----------------------------------------------------------------

$VB = New-Object -COMObject MSScriptControl.ScriptControl

$Cmd = @"
Set SapGuiAuto = GetObject(`"SAPGUI`")`n
Set application = SapGuiAuto.GetScriptingEngine`n
Set connection = application.Children(0)`n
Set session = connection.Children(0)`n
session.findById(`"wnd[0]/usr/txtRSYST-MANDT`").text = `"001`"`n
session.findById(`"wnd[0]/usr/txtRSYST-BNAME`").text = `"BCUSER`"`n
session.findById(`"wnd[0]/usr/pwdRSYST-BCODE`").text = `"minisap`"`n
session.findById(`"wnd[0]/usr/txtRSYST-LANGU`").text = `"EN`"`n
session.findById(`"wnd[0]`").sendVKey 0`n
"@

$VB.Language = "VBScript"
$VB.AllowUI = $TRUE
$VB.ExecuteStatement($Cmd)

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

As you can see looks the code a little bit unusual, but on this way you use only a VB.net function and PowerShell natively.

2016/03/08
Minor changes, explicit type detection for PowerShell 5 compatibility.
1 Comment
Labels in this area