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



我可以从桌面完美运行此脚本:

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"
);

最新更新