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

时间:2018-03-10 10:38:23

标签: c# powershell powershell-sdk

我可以在桌面上完美地运行此脚本:

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

1 个答案:

答案 0 :(得分:3)

像往常一样,

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"
);