PetSerAl has, as usual, provided the crucial pointer in a comment on the question:
Use .AddCommand()
to add a command by name or executable / script-file path.
- In you needed to pass arguments to that command, you would then have to use the
.AddParameters()
method - see example below.
By contrast, use the (poorly named) .AddScript()
method to add a self-contained piece of PowerShell source code as a string, which is parsed into a script block (a better name for the method would therefore have been .AddScriptBlock()
).
- In you needed to pass arguments, you would have to embed them directly in the source-code string - see example at the bottom.
Therefore, simply using .AddCommand()
in lieu of .AddScript()
is the solution:
ps.AddCommand(@"C:Program Files (x86)Home Controlscriptsalllightsoff.ps1");
If you wanted to pass an argument, say -Delay 60
, you'd then call:
ps.AddParameters(new Dictionary<string, int> { ["Delay"] = 60 });
Why .AddScript()
didn't work:
Since you're passing a piece of PowerShell source code, the usual evaluation rules apply:
A file path with embedded spaces such as
C:Program Files (x86)Home Controlalllightsoff.ps1
needs quoting for the PowerShell parser to recognize it as a single argument.
However, once quoted, you must use &
, the call operator, for PowerShell to know that the quoted path represents a command (script file) to invoke (otherwise, it would treat it as a string).
Hence, if you want to use .AddScript()
in your case, you must use:
ps.AddScript(@"& 'C:Program Files (x86)Home Controlscriptsalllightsoff.ps1'");
Note the leading &?
and the '...'
around the file path.
If you wanted to pass an argument, say -Delay 60
, you'd have to include it in the string:
ps.AddScript(
@"& 'C:Program Files (x86)Home Controlscriptsalllightsoff.ps1' -Delay 60"
);
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…