我可以从桌面完美运行此脚本:
private void Sleep_Click(object sender, EventArgs e)
{
PowerShell ps = PowerShell.Create();
ps.AddScript(@"D:Desktopalllightsoff.ps1");
ps.Invoke();
}
但是当我更改程序文件的路径时,它什么也没做..有什么想法吗?
private void Sleep_Click(object sender, EventArgs e)
{
PowerShell ps = PowerShell.Create();
ps.AddScript(@"C:Program Files (x86)Home Controlalllightsoff.ps1");
ps.Invoke();
}
可能与权限有关,该脚本不需要管理员权限即可运行,当我从程序文件夹中手动运行ps1脚本时,就可以正常工作。
我什至尝试了%AppData%文件夹并得到相同的结果,ps1文件无法运行。
PetSerAl像往常一样,在对这个问题的评论中提供了关键的指针:
-
使用
.AddCommand()
按名称或可执行文件/脚本文件路径添加命令。- 在您需要将参数传递给该命令时,您必须使用
.AddParameters()
方法 - 请参阅下面的示例。
- 在您需要将参数传递给该命令时,您必须使用
-
相比之下,使用(名称不佳的)
.AddScript()
方法将自包含的 PowerShell源代码段添加为字符串,该字符串被解析为脚本块(因此.AddScriptBlock()
该方法的更好名称)。- 在需要传递参数时,您必须将它们直接嵌入源代码字符串中 - 请参阅底部的示例。
因此,只需使用.AddCommand()
代替.AddScript()
即可解决问题:
ps.AddCommand(@"C:Program Files (x86)Home Controlscriptsalllightsoff.ps1");
如果你想传递一个论点,比如说-Delay 60
,然后你可以调用:
ps.AddParameters(new Dictionary<string, int> { ["Delay"] = 60 });
为什么.AddScript()
不起作用:
由于你要传递一段 PowerShell源代码,因此通常的评估规则适用:
具有嵌入空格(如C:Program Files (x86)Home Controlalllightsoff.ps1
)的文件路径需要引用,以便 PowerShell 分析器将其识别为单个参数。
但是,引用后,必须使用&
调用运算符,以便 PowerShell 知道引用的路径表示要调用的命令(脚本文件)(否则,它会将其视为字符串)。
因此,如果您想在机箱中使用.AddScript()
,则必须使用:
ps.AddScript(@"& 'C:Program Files (x86)Home Controlscriptsalllightsoff.ps1'");
请注意文件路径周围的前导&
和'...'
。
如果你想传递一个参数,比如-Delay 60
,你必须把它包含在字符串中:
ps.AddScript(
@"& 'C:Program Files (x86)Home Controlscriptsalllightsoff.ps1' -Delay 60"
);