3

I want to execute the PowerShell command in C + + programming. I've edited the command statement that needs to be run.PowerShell_CMDXML_File

kevin
  • 35
  • 1
  • 1
  • 6
  • 1
    How about something like `system("powershell 'echo \"hello from powershell\"'");`? I don't know how practical it is from anything more elaborate than that though... – Blaze Mar 07 '19 at 07:25
  • 1
    I think it might be prudent to dump out a temporary ps1 file for something as complicated as what is shown in your image. Then @Blaze's answer could be adjusted to `system("powershell -f temp.ps1");` – Matt R Mar 07 '19 at 07:46

1 Answers1

1

My assumption here is that you're trying to add -auto to the arguments. After reviewing the supplied image I would change the PowerShell code as well.

$task = Get-ScheduledTask "Test"
$items = @{}
if ($task.Actions.Execute -ne $null) {$items.Add('Execute', "$($task.Actions.Execute)")} 
$items.Add('Argument', "$($task.Actions.Arguments) -auto") 
if ($task.Actions.WorkingDirectory -ne $null) {$items.Add('WorkingDirectory',"$($task.Actions.WorkingDirectory)")} 
$action = New-ScheduledTaskAction @items
$task.Actions = $action
Set-ScheduledTask -InputObject $task


Far simpler and easier to understand.

To run this in c++ you should dump the code to a temporary file.

#include <iostream>
#include <fstream>

using namespace std;

int main()
{
    ofstream file;
    file.open("test.ps1");

    string newArg = "-auto";
    string powershell;
    powershell = "$task = Get-ScheduledTask \"Test\"\n";
    powershell += "$items = @{}\n";
    powershell += "if ($task.Actions.Execute -ne $null) {$items.Add('Execute', \"$($task.Actions.Execute)\")} \n";
    powershell += "$items.Add('Argument', \"$($task.Actions.Arguments) " + newArg + "\") \n"; // 'Argument' not a typo
    powershell += "if ($task.Actions.WorkingDirectory -ne $null) {$items.Add('WorkingDirectory',\"$($task.Actions.WorkingDirectory)\")} \n";
    powershell += "$action = New-ScheduledTaskAction @items\n";
    powershell += "$task.Actions = $action\n";
    powershell += "Set-ScheduledTask -InputObject $task\n";
    file << powershell << endl;
    file.close();

    system("powershell -ExecutionPolicy Bypass -F test.ps1");

    remove("test.ps1");
}
Matt R
  • 398
  • 2
  • 5
  • 1
    I call system () to execute when the script is disabled, I've changed the settings with the command--"Set-executionpolicy remotesigned", but I can do it when I right-click the PowerShell – kevin Mar 07 '19 at 09:18
  • So you're saying we can't use `-f file.ps1` ? – Matt R Mar 07 '19 at 09:30
  • Yes, I do not know why I use System () to perform the prompt to disable, manually right-click to do it. – kevin Mar 07 '19 at 09:37
  • I uploaded another XML file diagram, want to increase the red part of the node, without PowerShell implementation,can you help me write the command statement to increase this node? – kevin Mar 07 '19 at 10:07
  • I've added a bypass for the ExecutionPolicy and made it copy over existing values if they exist. This should run and add any parameter you like in the `newArg` string. – Matt R Mar 07 '19 at 11:37
  • thanks!I used it to do it -----system("powershell -ExecutionPolicy Bypass -F test.ps1"); – kevin Mar 08 '19 at 03:23
  • Can we just run a command without creating a temporary `.ps` file? – keineahnung2345 Aug 20 '20 at 06:37
  • @keineahnung2345You can by doing something like `system(("powershell -ExecutionPolicy Bypass -Command \"& {" + powershell + "}\"").c_str());` - Notice a string 'powershell' is used for the command and it's wrapped in `(string-goeshere).c_str();` to convert it to the necessary type. – Matt R Aug 20 '20 at 14:25