C# 无法从out program files文件夹运行ps1脚本

C# 无法从out program files文件夹运行ps1脚本,c#,powershell,powershell-sdk,C#,Powershell,Powershell Sdk,我可以在桌面上完美运行此脚本: private void Sleep_Click(object sender, EventArgs e) { PowerShell ps = PowerShell.Create(); ps.AddScript(@"D:\Desktop\alllightsoff.ps1"); ps.Invoke(); } 但是,当我更改程序文件的路径时,它不会起任何作用。。有什么想法吗 priv

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

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

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

  • 使用按名称或可执行文件/脚本文件路径添加命令

    • 如果需要将参数传递给该命令,则必须使用该方法-请参见下面的示例
  • 相比之下,使用(名称不好的)方法将一段自包含的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 });
请注意文件路径周围的前导
&
“…”

如果要传递参数,例如
-Delay 60
,则必须将其包含在字符串中:

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

所以我发现c:\test\有效,而c:\te st\无效,所以它与空格有关,我需要在c#
AddScript
->
AddCommand
ps.AddScript(
  @"& 'C:\Program Files (x86)\Home Control\scripts\alllightsoff.ps1' -Delay 60"
);