Page 1 of 1

Injecting powershell script

Posted: Wed May 11, 2022 11:14 pm
by Jagermeister
Brain no worky. I think PB forums is where I'd seen it before; how to push powershell script into a datasection or procedure and feed it to powershell within RunProgram. Talkin' about script not commands.

Anyone have a link or some hints?

The PS code is to convert Excel to CSV:

Code: Select all

$currDir = $PSScriptRoot
#Write-Host $currDir

foreach($file in (Get-ChildItem $currDir)) {
    
    if ($file.FullName -match ('\.xls')) {
        
        $newName = $file.FullName -replace ('\.xls.', '.csv')
        #Write-Host $newName
        
        $ExcelWB = new-object -comobject excel.application
        $Workbook = $ExcelWB.Workbooks.Open($file.FullName) 
        $Workbook.SaveAs($newName,6)
        $Workbook.Close($false)
        $ExcelWB.quit()
        
    }
}

Re: Injecting powershell script

Posted: Thu May 12, 2022 1:01 am
by Jagermeister
May have hit the jackpot here:

https://stackoverflow.com/questions/540 ... n-one-line

Any input is appreciated :)

Re: Injecting powershell script

Posted: Thu May 12, 2022 8:35 am
by Mindphazer
Try to read this :
https://www.purebasic.fr/english/viewtopic.php?t=66432

It may be a good start, if i understood well your question

Re: Injecting powershell script

Posted: Thu May 12, 2022 9:10 am
by Mindphazer
And if you need to execute a powershell script within Purebasic, you can write the script into a .ps1 file, then execute it, like this (not tested) :

Code: Select all

ScriptPW = CreateFile(#PB_Any, GetTemporaryDirectory() + "\Script.ps1")
If ScriptPW
  WriteStringN(ScriptPW, "$currDir = $PSScriptRoot")
  WriteStringN(ScriptPW, "#Write-Host $currDir")
  WriteStringN(ScriptPW, "foreach($file in (Get-ChildItem $currDir)) {")
  WriteStringN(ScriptPW, "  if ($file.FullName -match ('\.xls')) {")
  WriteStringN(ScriptPW, "    $newName = $file.FullName -replace ('\.xls.', '.csv')")
  WriteStringN(ScriptPW, "    #Write-Host $newName")
  WriteStringN(ScriptPW, "    $ExcelWB = new-object -comobject excel.application")
  WriteStringN(ScriptPW, "    $Workbook = $ExcelWB.Workbooks.Open($file.FullName)")
  WriteStringN(ScriptPW, "    $Workbook.SaveAs($newName,6)")
  WriteStringN(ScriptPW, "    $Workbook.Close($false)")
  WriteStringN(ScriptPW, "    $ExcelWB.quit()")
  WriteStringN(ScriptPW, "  }")
  WriteStringN(ScriptPW, "}")
  CloseFile(ScriptPW) 
  CmdPromptRun = RunProgram("powershell.exe", GetTemporaryDirectory() + "\Script.ps1", "", #PB_Program_Open|#PB_Program_Read|#PB_Program_Hide)
  If CmdPromptRun
    While ProgramRunning(CmdPromptRun)
      KeepOutCmd$ = KeepOutCmd$ + CmdPromptRun
    Wend
    CloseProgram(CmdPromptRun)
    Debug  KeepOutCmd$
  EndIf
EndIf

Re: Injecting powershell script

Posted: Thu May 12, 2022 6:39 pm
by Jagermeister
Awesome! Thank you, Mindphazer!

Re: Injecting powershell script

Posted: Thu May 12, 2022 7:50 pm
by Jagermeister
1. Ran this from Visual Studio (PB encoding was different than PS encoding. PS didn't like it.):

Code: Select all

$code = {

    [My Powershell code here]
    
}

[convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($code))
2. Copied the output and placed in PB. Spits out the CSVs with no fuss :)

Code: Select all

Encoded$ = "DQAKAA0ACgAkAGMAdQByAHIARABpAHIAIAA9ACAAJABQAFMAUwBjAHIAaQBwAHQAUgBvAG8AdAANAAoAIwBXAHIAaQB0AGUALQBIAG8AcwB0ACAAJABjAHUAcgByAEQAaQByAA0ACgANAAoAZgBvAHIAZQBhAGMAaAAoACQAZgBpAGwAZQAgAGkAbgAgACgARwBlAHQALQBDAGgAaQBsAGQASQB0AGUAbQAgACQAYwB1AHIAcgBEAGkAcgApACkAIAB7AA0ACgAgACAAIAAgAA0ACgAgACAAIAAgAGkAZgAgACgAJABmAGkAbABlAC4ARgB1AGwAbABOAGEAbQBlACAALQBtAGEAdABjAGgAIAAoACcAXAAuAHgAbABzACcAKQApACAAewANAAoAIAAgACAAIAAgACAAIAAgAA0ACgAgACAAIAAgACAAIAAgACAAJABuAGUAdwBOAGEAbQBlACAAPQAgACQAZgBpAGwAZQAuAEYAdQBsAGwATgBhAG0AZQAgAC0AcgBlAHAAbABhAGMAZQAgACgAJwBcAC4AeABsAHMALgAnACwAIAAnAC4AYwBzAHYAJwApAA0ACgAgACAAIAAgACAAIAAgACAAIwBXAHIAaQB0AGUALQBIAG8AcwB0ACAAJABuAGUAdwBOAGEAbQBlAA0ACgAgACAAIAAgACAAIAAgACAADQAKACAAIAAgACAAIAAgACAAIAAkAEUAeABjAGUAbABXAEIAIAA9ACAAbgBlAHcALQBvAGIAagBlAGMAdAAgAC0AYwBvAG0AbwBiAGoAZQBjAHQAIABlAHgAYwBlAGwALgBhAHAAcABsAGkAYwBhAHQAaQBvAG4ADQAKACAAIAAgACAAIAAgACAAIAAkAFcAbwByAGsAYgBvAG8AawAgAD0AIAAkAEUAeABjAGUAbABXAEIALgBXAG8AcgBrAGIAbwBvAGsAcwAuAE8AcABlAG4AKAAkAGYAaQBsAGUALgBGAHUAbABsAE4AYQBtAGUAKQAgAA0ACgAgACAAIAAgACAAIAAgACAAJABXAG8AcgBrAGIAbwBvAGsALgBTAGEAdgBlAEEAcwAoACQAbgBlAHcATgBhAG0AZQAsADYAKQANAAoAIAAgACAAIAAgACAAIAAgACQAVwBvAHIAawBiAG8AbwBrAC4AQwBsAG8AcwBlACgAJABmAGEAbABzAGUAKQANAAoAIAAgACAAIAAgACAAIAAgACQARQB4AGMAZQBsAFcAQgAuAHEAdQBpAHQAKAApAA0ACgAgACAAIAAgACAAIAAgACAADQAKACAAIAAgACAAfQANAAoAfQANAAoA"

Compiler = RunProgram("powershell", "-EncodedCommand " + Encoded$, #Null$, #PB_Program_Hide | #PB_Program_Open | #PB_Program_Read)
CloseProgram(Compiler) ; Close the connection to the program
Very cool. I have two dozen domain management scripts to make Godzilla status with PB now :)

Thanks PB team and lurkers!

UPDATE:

Added a bit of wait code to allow PS to do it's thing before PB moves on. (For us novices. The pros already know this stuff.)

Code: Select all

 Encoded$ = "DQAKAA0ACgAkAGMAdQByAHIARABpAHIAIAA9ACAAJABQAFMAUwBjAHIAaQBwAHQAUgBvAG8AdAANAAoAIwBXAHIAaQB0AGUALQBIAG8AcwB0ACAAJABjAHUAcgByAEQAaQByAA0ACgANAAoAZgBvAHIAZQBhAGMAaAAoACQAZgBpAGwAZQAgAGkAbgAgACgARwBlAHQALQBDAGgAaQBsAGQASQB0AGUAbQAgACQAYwB1AHIAcgBEAGkAcgApACkAIAB7AA0ACgAgACAAIAAgAA0ACgAgACAAIAAgAGkAZgAgACgAJABmAGkAbABlAC4ARgB1AGwAbABOAGEAbQBlACAALQBtAGEAdABjAGgAIAAoACcAXAAuAHgAbABzACcAKQApACAAewANAAoAIAAgACAAIAAgACAAIAAgAA0ACgAgACAAIAAgACAAIAAgACAAJABuAGUAdwBOAGEAbQBlACAAPQAgACQAZgBpAGwAZQAuAEYAdQBsAGwATgBhAG0AZQAgAC0AcgBlAHAAbABhAGMAZQAgACgAJwBcAC4AeABsAHMALgAnACwAIAAnAC4AYwBzAHYAJwApAA0ACgAgACAAIAAgACAAIAAgACAAIwBXAHIAaQB0AGUALQBIAG8AcwB0ACAAJABuAGUAdwBOAGEAbQBlAA0ACgAgACAAIAAgACAAIAAgACAADQAKACAAIAAgACAAIAAgACAAIAAkAEUAeABjAGUAbABXAEIAIAA9ACAAbgBlAHcALQBvAGIAagBlAGMAdAAgAC0AYwBvAG0AbwBiAGoAZQBjAHQAIABlAHgAYwBlAGwALgBhAHAAcABsAGkAYwBhAHQAaQBvAG4ADQAKACAAIAAgACAAIAAgACAAIAAkAFcAbwByAGsAYgBvAG8AawAgAD0AIAAkAEUAeABjAGUAbABXAEIALgBXAG8AcgBrAGIAbwBvAGsAcwAuAE8AcABlAG4AKAAkAGYAaQBsAGUALgBGAHUAbABsAE4AYQBtAGUAKQAgAA0ACgAgACAAIAAgACAAIAAgACAAJABXAG8AcgBrAGIAbwBvAGsALgBTAGEAdgBlAEEAcwAoACQAbgBlAHcATgBhAG0AZQAsADYAKQANAAoAIAAgACAAIAAgACAAIAAgACQAVwBvAHIAawBiAG8AbwBrAC4AQwBsAG8AcwBlACgAJABmAGEAbABzAGUAKQANAAoAIAAgACAAIAAgACAAIAAgACQARQB4AGMAZQBsAFcAQgAuAHEAdQBpAHQAKAApAA0ACgAgACAAIAAgACAAIAAgACAADQAKACAAIAAgACAAfQANAAoAfQANAAoA"
  
  Compiler = RunProgram("powershell", "-EncodedCommand " + Encoded$, #Null$, #PB_Program_Hide | #PB_Program_Open | #PB_Program_Read)
  wait = WaitProgram(Compiler)
  
  If Not wait
    CloseProgram(Compiler)
  EndIf

Re: Injecting powershell script

Posted: Fri May 13, 2022 10:45 am
by infratec
If you read the help, you will see that is is the better way if you don't want to do something with the output:

Code: Select all

Encoded$ = "DQAKAA0ACgAkAGMAdQByAHIARABpAHIAIAA9ACAAJABQAFMAUwBjAHIAaQBwAHQAUgBvAG8AdAANAAoAIwBXAHIAaQB0AGUALQBIAG8AcwB0ACAAJABjAHUAcgByAEQAaQByAA0ACgANAAoAZgBvAHIAZQBhAGMAaAAoACQAZgBpAGwAZQAgAGkAbgAgACgARwBlAHQALQBDAGgAaQBsAGQASQB0AGUAbQAgACQAYwB1AHIAcgBEAGkAcgApACkAIAB7AA0ACgAgACAAIAAgAA0ACgAgACAAIAAgAGkAZgAgACgAJABmAGkAbABlAC4ARgB1AGwAbABOAGEAbQBlACAALQBtAGEAdABjAGgAIAAoACcAXAAuAHgAbABzACcAKQApACAAewANAAoAIAAgACAAIAAgACAAIAAgAA0ACgAgACAAIAAgACAAIAAgACAAJABuAGUAdwBOAGEAbQBlACAAPQAgACQAZgBpAGwAZQAuAEYAdQBsAGwATgBhAG0AZQAgAC0AcgBlAHAAbABhAGMAZQAgACgAJwBcAC4AeABsAHMALgAnACwAIAAnAC4AYwBzAHYAJwApAA0ACgAgACAAIAAgACAAIAAgACAAIwBXAHIAaQB0AGUALQBIAG8AcwB0ACAAJABuAGUAdwBOAGEAbQBlAA0ACgAgACAAIAAgACAAIAAgACAADQAKACAAIAAgACAAIAAgACAAIAAkAEUAeABjAGUAbABXAEIAIAA9ACAAbgBlAHcALQBvAGIAagBlAGMAdAAgAC0AYwBvAG0AbwBiAGoAZQBjAHQAIABlAHgAYwBlAGwALgBhAHAAcABsAGkAYwBhAHQAaQBvAG4ADQAKACAAIAAgACAAIAAgACAAIAAkAFcAbwByAGsAYgBvAG8AawAgAD0AIAAkAEUAeABjAGUAbABXAEIALgBXAG8AcgBrAGIAbwBvAGsAcwAuAE8AcABlAG4AKAAkAGYAaQBsAGUALgBGAHUAbABsAE4AYQBtAGUAKQAgAA0ACgAgACAAIAAgACAAIAAgACAAJABXAG8AcgBrAGIAbwBvAGsALgBTAGEAdgBlAEEAcwAoACQAbgBlAHcATgBhAG0AZQAsADYAKQANAAoAIAAgACAAIAAgACAAIAAgACQAVwBvAHIAawBiAG8AbwBrAC4AQwBsAG8AcwBlACgAJABmAGEAbABzAGUAKQANAAoAIAAgACAAIAAgACAAIAAgACQARQB4AGMAZQBsAFcAQgAuAHEAdQBpAHQAKAApAA0ACgAgACAAIAAgACAAIAAgACAADQAKACAAIAAgACAAfQANAAoAfQANAAoA"
  
RunProgram("powershell", "-EncodedCommand " + Encoded$, #Null$, #PB_Program_Wait)
Use

Code: Select all

#PB_Program_Hide
to hide the execution.

Re: Injecting powershell script

Posted: Fri May 13, 2022 8:46 pm
by Jagermeister
Thanks for the hint, infratec!