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

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

最佳答案

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

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

    • 在您需要将参数 传递给该命令时,您将不得不使用.AddParameters()方法 - 请参见下面的示例。
  • 相比之下,使用(命名不当的) .AddScript() 方法添加一段独立的 PowerShell 源代码作为字符串,它被解析成一个脚本 block (因此该方法的更好名称应该是 .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"
);

关于c# - 无法从程序文件文件夹运行 ps1 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49208084/

相关文章:

c# - 将参数从 C# 传递到调用的 PowerShell 脚本

c# - WCF : pushing data between two independent applications

c# - 在 C# 中对 ListView 进行排序时忽略 "The"和 "A"

c# - 如何同时将多行发送到 mysql(如批量复制)?

multithreading - 从运行空间内的模块调用函数

具有智能感知功能的 Powershell 编辑器可以嵌入到我的程序中吗?

c# - .net 核心注册通用接口(interface)并使用 getservice 检索它们

使用 UTF-8 编码的 Powershell 字符串变量

powershell - PowerShell从URL抓取纯文本并将其用作变量

powershell - 在 Start-Process 中添加一个命令以向 Plink 提供 "y"输入