gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:54:56 24 4
gpt4 key购买 nike

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

    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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com