不能从程序文件文件夹中 运行 ps1 脚本

Cant run ps1 script from out program files folder

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

    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 文件没有 运行。

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

  • 使用.AddCommand()通过[=56=添加一个命令 ]名称或可执行/script-file路径.

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

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

因此,只需使用 .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 需要 quoting 以便 PowerShell 解析器将其识别为 单个 参数。

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

因此,如果您想在您的案例中使用 .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"
);