不能从程序文件文件夹中 运行 ps1 脚本
Cant run ps1 script from out program files folder
我可以 运行 从我的桌面上完美地运行这个脚本:
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()
通过[=56=添加一个命令 ]名称或可执行/script-file路径.
- 如果您需要将 参数 传递给该命令,则您必须使用
.AddParameters()
方法 - 请参见下面的示例。
相比之下,使用(命名不当).AddScript()
方法添加一个self-contained块PowerShell 源代码作为字符串,被解析为脚本块 (因此,该方法的更好名称应该是 .AddScriptBlock()
).
- 在您需要传递 参数 时,您必须将它们直接嵌入 source-code 字符串中 - 请参阅底部的示例。
因此,只需使用 .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
需要 quoting 以便 PowerShell 解析器将其识别为 单个 参数。
但是,一旦引用,您必须使用调用运算符 &
,PowerShell 才能知道引用的路径表示 命令(脚本文件)到 invoke(否则,它会将其视为 string)。
因此,如果您想在您的案例中使用 .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"
);
我可以 运行 从我的桌面上完美地运行这个脚本:
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()
通过[=56=添加一个命令 ]名称或可执行/script-file路径.- 如果您需要将 参数 传递给该命令,则您必须使用
.AddParameters()
方法 - 请参见下面的示例。
- 如果您需要将 参数 传递给该命令,则您必须使用
相比之下,使用(命名不当)
.AddScript()
方法添加一个self-contained块PowerShell 源代码作为字符串,被解析为脚本块 (因此,该方法的更好名称应该是.AddScriptBlock()
).- 在您需要传递 参数 时,您必须将它们直接嵌入 source-code 字符串中 - 请参阅底部的示例。
因此,只需使用 .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
需要 quoting 以便 PowerShell 解析器将其识别为 单个 参数。
但是,一旦引用,您必须使用调用运算符 &
,PowerShell 才能知道引用的路径表示 命令(脚本文件)到 invoke(否则,它会将其视为 string)。
因此,如果您想在您的案例中使用 .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"
);