想要从C ++程序内部运行PowerShell代码

时间:2019-06-07 18:02:51

标签: c++ powershell

我希望能够像我的c ++程序一样运行30行PowerShell脚本。我听说这是一个糟糕的主意,我不在乎。我仍然想知道如何。

我只想直接在C ++程序中编码,我不想从外部调用PowerShell脚本。有什么办法吗?如果不可能,那就说不。

例如

void runPScode() {

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

}

谢谢!

我一直在寻找执行此操作的命令,并且已经阅读了几个“相似”问题。

3 个答案:

答案 0 :(得分:3)

这只是出于完整性的考虑


PowerShell具有API-请参见System.Management.Automation.PowerShell。该API是受管理的(即,基于.NET的)。可以构建一个混合模式的C ++应用程序,并从被管理部分调用所述API。

将以下内容放入单独的C ++文件中:

#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();
}

在“项目属性”的VC ++目录下,将C:\Program Files (x86)\Reference Assemblies\Microsoft\WindowsPowerShell\3.0添加到参考目录(您的路径可能会有所不同)。

仅为该文件设置以下编译器选项

  • 公共语言运行时支持(/ clr)
  • 调试信息格式-程序数据库(/ Zi)
  • 启用C ++异常-否
  • 基本运行时检查-默认
  • 预编译头-不使用预编译头

您需要/clr才能从C ++调用.NET,但是/clr与许多其他C ++选项不兼容。如果您错过了某些内容,编译器错误消息将让您知道。

在项目的非托管部分中将void RunPowerShell(LPCWSTR)声明为常规外部函数,根据需要调用。


也就是说,无论您的Powershell做什么,C ++ / Win32都可以做到

答案 1 :(得分:2)

//command to tell compiler the following is PowerShell code

不!没有这样的命令可以告诉编译器,并且

//a bunch of PowerShell code ...

被内联执行。

您可以使用CreateProcess()函数选择您的外壳,并为其提供适当的代码来执行。

答案 2 :(得分:0)

您有两个选择:使用系统或CreateProcess。系统文档位于:

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

使用此方法可以传递字符串命令。一个示例,如文档中所示:

system( "type crt_system.txt" );

CreateProcess文档位于:

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

使用此命令比较棘手,我不建议在简单命令中使用它。

有关其他信息,请参见: how can we use a batch file in c++?