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
to hide the execution.
Re: Injecting powershell script
Posted: Fri May 13, 2022 8:46 pm
by Jagermeister
Thanks for the hint, infratec!