3

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

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

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

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

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

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

4

1 回答 1

4

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

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

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

    • 在您需要传递参数时,您必须将它们直接嵌入到源代码字符串中 - 请参见底部的示例。

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

ps.AddCommand(@"C:\Program Files (x86)\Home Control\scripts\alllightsoff.ps1");

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

ps.AddParameters(new Dictionary<string, int> { ["Delay"] = 60 });

为什么.AddScript()没有工作:

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

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

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

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

ps.AddScript(@"& 'C:\Program Files (x86)\Home Control\scripts\alllightsoff.ps1'");

注意文件路径的前导'...'周围。

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

ps.AddScript(
  @"& 'C:\Program Files (x86)\Home Control\scripts\alllightsoff.ps1' -Delay 60"
);
于 2018-03-10T16:43:33.197 回答