III*_*III 3 c# powershell powershell-sdk
我可以从我的桌面完美运行这个脚本:
private void Sleep_Click(object sender, EventArgs e)
{
PowerShell ps = PowerShell.Create();
ps.AddScript(@"D:\Desktop\alllightsoff.ps1");
ps.Invoke();
}
Run Code Online (Sandbox Code Playgroud)
但是当我更改程序文件的路径时,它什么也没做......有什么想法吗?
private void Sleep_Click(object sender, EventArgs e)
{
PowerShell ps = PowerShell.Create();
ps.AddScript(@"C:\Program Files (x86)\Home Control\alllightsoff.ps1");
ps.Invoke();
}
Run Code Online (Sandbox Code Playgroud)
可能与权限有关,该脚本不需要管理员权限即可运行,当我从程序文件夹手动运行 ps1 脚本时就可以正常工作。
我什至尝试了 %AppData% 文件夹并得到相同的结果,ps1 文件无法运行。
像往常一样, PetSerAl在对该问题的评论中提供了关键点:
\n\n用于按名称或可执行文件/脚本文件路径.AddCommand()添加命令。
.AddParameters()方法 - 请参阅下面的示例。相比之下,使用(命名不佳)方法将一段独立的 PowerShell源代码.AddScript()添加为字符串,该字符串将被解析为脚本块(因此,该方法的更好名称应该是)。.AddScriptBlock()
因此,简单地使用.AddCommand()代替.AddScript()就是解决方案:
ps.AddCommand(@"C:\\Program Files (x86)\\Home Control\\scripts\\alllightsoff.ps1");\nRun Code Online (Sandbox Code Playgroud)\n\n如果你想传递一个参数,比如说-Delay 60,你可以调用:
ps.AddParameters(new Dictionary<string, int> { ["Delay"] = 60 });\nRun Code Online (Sandbox Code Playgroud)\n\n.AddScript()不起作用:由于您传递的是一段 PowerShell源代码,因此通常的评估规则适用:
\n\n
包含嵌入空格(例如\n)的文件路径C:\\Program Files (x86)\\Home Control\\alllightsoff.ps1需要引用,以便 PowerShell 解析器将其识别为单个参数。
但是,一旦引用,您必须使用&调用运算符 ,以便 PowerShell 知道引用的路径代表要调用的命令(脚本文件)(否则,它会将其视为字符串)。
因此,如果您想在您的情况下使用.AddScript(),则必须使用:
ps.AddScript(@"& \'C:\\Program Files (x86)\\Home Control\\scripts\\alllightsoff.ps1\'");\nRun Code Online (Sandbox Code Playgroud)\n\n请注意文件路径的前导&\xc2\xa0和周围。\'...\'
如果你想传递一个参数,比如说-Delay 60,你必须将它包含在字符串中:
ps.AddScript(\n @"& \'C:\\Program Files (x86)\\Home Control\\scripts\\alllightsoff.ps1\' -Delay 60"\n);\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
973 次 |
| 最近记录: |