无法从程序文件文件夹运行 ps1 脚本

III*_*III 3 c# powershell powershell-sdk

我可以从我的桌面完美运行这个脚本:

    private void Sleep_Click(object sender, EventArgs e)
    {
         PowerShell ps = PowerShell.Create();
         ps.AddScript(@"D:\Desktop\alllightsoff.ps1");
         ps.Invoke();
    }
Run Code Online (Sandbox Code Playgroud)

但是当我更改程序文件的路径时,它什么也没做......有什么想法吗?

    private void Sleep_Click(object sender, EventArgs e)
    {
        PowerShell ps = PowerShell.Create();
        ps.AddScript(@"C:\Program Files (x86)\Home Control\alllightsoff.ps1");
        ps.Invoke();
    }
Run Code Online (Sandbox Code Playgroud)

可能与权限有关,该脚本不需要管理员权限即可运行,当我从程序文件夹手动运行 ps1 脚本时就可以正常工作。

我什至尝试了 %AppData% 文件夹并得到相同的结果,ps1 文件无法运行。

mkl*_*nt0 6

像往常一样, PetSerAl在对该问题的评论中提供了关键点:

\n\n
    \n
  • 用于名称可执行文件/脚本文件路径.AddCommand()添加命令

    \n\n
      \n
    • 如果您需要将参数传递给该命令,则必须使用该.AddParameters()方法 - 请参阅下面的示例。
    • \n
  • \n
  • 相比之下,使用(命名不佳)方法将一段独立的 PowerShell源代码.AddScript()添加字符串,该字符串将被解析为脚本块(因此,该方法的更好名称应该是)。.AddScriptBlock()

    \n\n
      \n
    • 如果您需要传递参数,则必须将它们直接嵌入到源代码字符串中 - 请参阅底部的示例。
    • \n
  • \n
\n\n

因此,简单地使用.AddCommand()代替.AddScript()就是解决方案:

\n\n
ps.AddCommand(@"C:\\Program Files (x86)\\Home Control\\scripts\\alllightsoff.ps1");\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果你想传递一个参数,比如说-Delay 60,你可以调用:

\n\n
ps.AddParameters(new Dictionary<string, int> { ["Delay"] = 60 });\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

为什么.AddScript()不起作用:

\n\n

由于您传递的是一段 PowerShell源代码,因此通常的评估规则适用:

\n\n


包含嵌入空格(例如\n)的文件路径C:\\Program Files (x86)\\Home Control\\alllightsoff.ps1需要引用,以便 PowerShell 解析器将其识别为单个参数。

\n\n

但是,一旦引用,您必须使用&调用运算符 ,以便 PowerShell 知道引用的路径代表要调用的命令(脚本文件)(否则,它会将其视为字符串

\n\n

因此,如果您想在您的情况下使用.AddScript(),则必须使用:

\n\n
ps.AddScript(@"& \'C:\\Program Files (x86)\\Home Control\\scripts\\alllightsoff.ps1\'");\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意文件路径的前导&\xc2\xa0和周围。\'...\'

\n\n

如果你想传递一个参数,比如说-Delay 60,你必须将它包含在字符串中:

\n\n
ps.AddScript(\n  @"& \'C:\\Program Files (x86)\\Home Control\\scripts\\alllightsoff.ps1\' -Delay 60"\n);\n
Run Code Online (Sandbox Code Playgroud)\n