问题
I can run this script perfectly from my desktop:
private void Sleep_Click(object sender, EventArgs e)
{
PowerShell ps = PowerShell.Create();
ps.AddScript(@"D:\Desktop\alllightsoff.ps1");
ps.Invoke();
}
But when i change the paths to program files it does nothing.. any ideas?
private void Sleep_Click(object sender, EventArgs e)
{
PowerShell ps = PowerShell.Create();
ps.AddScript(@"C:\Program Files (x86)\Home Control\alllightsoff.ps1");
ps.Invoke();
}
Has proberly something to do with permissions, the script doesnt needs admin rights to run, and when i manually run the ps1 script from the program folder is just works ok.
I even tried %AppData% folder and getting the same result, ps1 file doesnt run.
回答1:
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 Control\scripts\alllightsoff.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 asC:\Program Files (x86)\Home Control\alllightsoff.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 Control\scripts\alllightsoff.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 Control\scripts\alllightsoff.ps1' -Delay 60"
);
来源:https://stackoverflow.com/questions/49208084/cant-run-ps1-script-from-out-program-files-folder