我可以从我的桌面上完美地运行这个脚本:
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/