我可以在桌面上完美地运行此脚本:
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文件也没有运行。
答案 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"
);