Would like to run PowerShell code from inside a C++ program

Viewed 4655

I want to be able to run like 30 lines of PowerShell script from my c++ program. I've heard it's a terrible idea, I don't care. I still would like to know how.

I just want to code directly in the C++ program, i do not want to externally call the PowerShell script. Is there any way to do this? If it's impossible, just say no.

For example

void runPScode() {

//command to tell compiler the following is PowerShell code
//a bunch of PowerShell code

}

Thanks!

I've looked for commands to do this and have read several 'similar' questions.

3 Answers

This just for completeness' sake:


PowerShell has an API - see System.Management.Automation.PowerShell. The API is managed (i. e. .NET-based). It's possible to build a mixed mode C++ application and invoke said API from the managed part.

Place the following into a separate C++ file:

#include "stdafx.h"
#include <vcclr.h>
#using <mscorlib.dll>
#using <System.dll>
#using <System.Management.Automation.dll>

using namespace System;
using namespace System::Management::Automation;

void RunPowerShell(LPCWSTR s)
{
    PowerShell::Create()->AddScript(gcnew String(s))->Invoke();
}

In Project Properties, under VC++ Directories, add C:\Program Files (x86)\Reference Assemblies\Microsoft\WindowsPowerShell\3.0 to Reference Directories (your path may vary).

Set the following compiler options for that file only:

  • Common Language RunTime Support (/clr)
  • Debug information format - Program Database (/Zi)
  • Enable C++ exceptions - No
  • Basic runtime checks - Default
  • Precompiled header - Not Using Precompiled Headers

You need /clr for calling .NET from C++, but /clr is incompatible with a bunch of other C++ options. If you miss something, the compiler error messages will let you know.

Declare void RunPowerShell(LPCWSTR) as a regular external function in the unmanaged parts of the project, invoke as needed.


That said, whatever your Powershell does, C++/Win32 probably can do too. That said, some one-line features of Powershell (e. g. the remoting) would translate into hundreds of lines of C++.

//command to tell compiler the following is PowerShell code

No! There's no such command to tell the compiler, and

//a bunch of PowerShell code ...

being executed inline.

You can achieve this using the CreateProcess() function choosing your shell, and provide it with the appropriate code to execute.

You have two options: using system or CreateProcess. The system documentation is found at:

https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/system-wsystem?view=vs-2019

Using this method you pass a string command. An example, as shown in the documentation:

system( "type crt_system.txt" );

CreateProcess documentation is found at:

https://docs.microsoft.com/en-us/windows/desktop/api/processthreadsapi/nf-processthreadsapi-createprocessa

Using this command is a little trickier and I wouldn't recommend it for simple commands.

For additional information please see: how can we use a batch file in c++?

Related