C++中调用Powershell浅析

0x01 Intro

工作的项目,主要是使用的C++开发,在Windows平台下还大量引入了Powershell脚本用于快速扩展一些功能。这篇笔记主要来总结下,在基于C/C++的Windows编程中,如何快速方便的调用Powershell脚本。

0x02 C#调用Powershell代码

为什么要从C#开始讲起呢?因为我们知道,Powershell实际上是属于C#的子集(System.Management.Automation),所以实际上我们在C#中调用Powershell就是调用 System.Management.Automation 对象。
新建一个C#工程,并且添加 System.Management.Automation 的引用,这部分在标准库中可能查找不到,需要自己手动指定DLL文件的位置,其一般位于 C:\Program Files (x86)\Reference Assemblies\Microsoft\WindowsPowerShell\3.0 (这里还是推荐Everything省去很多烦恼)。基本的代码如下:

1
2
using System.Management.Automation;
using System.Collections.ObjectModel;

引用增加如上两个类,后者主要用于存储脚本的输出对象,创建并调用的过程就更简单了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using (PowerShell PowerShellInstance = PowerShell.Create())
{
PowerShellInstance.AddScript("Multi-Line Powershell Code;ETc...;");
PowerShellInstance.AddParameter("param1", "parameter 1 value!");
}
Collection<PSObject> PSOutput = PowerShellInstance.Invoke();
foreach (PSObject outputItem in PSOutput)
{
if (outputItem != null)
{
Console.WriteLine(outputItem.BaseObject.GetType().FullName);
Console.WriteLine(outputItem.BaseObject.ToString() + "\n");
}
}

0x03 在C++中调用C#代码

既然C#能够如此方便的调用Powershell,那么如果我们能在C++中直接调用C#代码,不就也解决了调用Powershell的问题了吗?
微软已经为我们想到了CLR
谈CLR之前也想谈谈COM,因为后面也会用到
我们新建一个CLR工程

https://docs.microsoft.com/zh-cn/dotnet/standard/clr

0x04 使用CMake构建工程

0x05 在C++中调用Powershell代码

0x05 Summary

Ref

https://stackoverflow.com/questions/19634220/c-and-powershell
https://www.codeproject.com/Articles/880154/MFC-PowerShells-Easily
https://stackoverflow.com/questions/40126734/set-clr-support-to-true-with-cmake
https://gitlab.kitware.com/cmake/cmake/tree/master/Tests/CSharpLinkToCxx
http://blog.csdn.net/xum2008/article/details/7268761
https://github.com/honeyful/powershellExecute
https://www.codeproject.com/Articles/18229/How-to-run-PowerShell-scripts-from-C
https://blogs.msdn.microsoft.com/saveenr/2010/03/08/how-to-create-a-powershell-2-0-module-and-cmdlet-with-visual-studio-2010-screencast-included/
https://www.codeproject.com/Articles/1210366/Compiling-your-C-code-to-NET-Part
https://www.codeproject.com/Articles/1128868/Compiling-Your-C-Code-to-NET-Part