-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathpowershell_cpp.cpp
89 lines (76 loc) · 2.88 KB
/
powershell_cpp.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#using <mscorlib.dll>
#include <vcclr.h>
#include <memory>
#include <powershell_cpp/string.hpp>
#pragma managed
using namespace System;
using namespace System::Management::Automation;
ref class PSOutHelper
{
public:
void OnDataAddedDebug(Object ^sender, DataAddedEventArgs ^args)
{
ConsoleColor original = Console::ForegroundColor;
Console::ForegroundColor = ConsoleColor::Blue;
Console::WriteLine(args);
Console::ForegroundColor = original;
}
void OnDataAddedProgress(Object ^sender, DataAddedEventArgs ^args)
{
ConsoleColor original = Console::ForegroundColor;
Console::ForegroundColor = ConsoleColor::Green;
Console::WriteLine(args);
Console::ForegroundColor = original;
}
void OnDataAddedVerbose(Object ^sender, DataAddedEventArgs ^args)
{
Console::WriteLine(args);
}
void OnDataAddedWarning(Object ^sender, DataAddedEventArgs ^args)
{
ConsoleColor original = Console::ForegroundColor;
Console::ForegroundColor = ConsoleColor::Yellow;
Console::WriteLine(args);
Console::ForegroundColor = original;
}
void OnDataAddedError(Object ^sender, DataAddedEventArgs ^args)
{
ConsoleColor original = Console::ForegroundColor;
Console::ForegroundColor = ConsoleColor::Red;
Console::WriteLine(args);
Console::ForegroundColor = original;
}
};
namespace ps {
/// PowerShell interpreter
class Interpreter
{
public:
Interpreter()
{
h = gcnew PSOutHelper();
}
/// Execute <paramref="script_code" /> synchronously
void exec_script_sync(const string &script_code)
{
PowerShell ^ps_interpreter = PowerShell::Create();
ps_interpreter->Streams->Debug->DataAdded += gcnew EventHandler<DataAddedEventArgs ^>(h, &PSOutHelper::OnDataAddedDebug);
ps_interpreter->Streams->Progress->DataAdded += gcnew EventHandler<DataAddedEventArgs ^>(h, &PSOutHelper::OnDataAddedProgress);
ps_interpreter->Streams->Verbose->DataAdded += gcnew EventHandler<DataAddedEventArgs ^>(h, &PSOutHelper::OnDataAddedVerbose);
ps_interpreter->Streams->Warning->DataAdded += gcnew EventHandler<DataAddedEventArgs ^>(h, &PSOutHelper::OnDataAddedWarning);
ps_interpreter->Streams->Error->DataAdded += gcnew EventHandler<DataAddedEventArgs ^>(h, &PSOutHelper::OnDataAddedError);
String ^script_code_m = gcnew String(script_code.c_str());
ps_interpreter->AddScript(script_code_m);
auto result = ps_interpreter->Invoke();
for each(PSObject ^ps_object in result)
Console::WriteLine(ps_object);
}
private:
gcroot<PSOutHelper ^> h;
};
}
int main()
{
ps::Interpreter ps_interpreter = ps::Interpreter();
ps_interpreter.exec_script_sync(_T(R"(Get-Command)"));
}