Cant run ps1 script from out program files folder

后端 未结 1 1432
囚心锁ツ
囚心锁ツ 2020-12-19 19:56

I can run this script perfectly from my desktop:

    private void Sleep_Click(object sender, EventArgs e)
    {
         PowerShell ps = PowerShell.Create();         


        
相关标签:
1条回答
  • 2020-12-19 20:40

    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 as
    C:\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"
    );
    
    0 讨论(0)
提交回复
热议问题