我正在尝试从节点运行PowerShell脚本。以下是我当前的代码:
try {
var spawn = require("child_process").spawn,child;
child = spawn("powershell.exe", ['-file', "..\\build.ps1", "-devmode"])
child.stdout.on("data",function(data){
//console.log("Powershell Data: " + data);
});
child.stderr.on("data",function(data){
console.log("Powershell Errors: " + data);
});
child.on("exit",function(){
console.log("Powershell Script finished");
});
child.stdin.end(); //end input
} catch (error) {
console.error(error);
}
代码基于this question。当我运行它时,我得到以下错误:
Powershell Errors: File C:\<path>\build.ps1 cannot be loaded because running scripts is disabled on this system. For more information,
see about_Execution_Policies at https:/go.microsoft.com/fwlink/?LinkID=135170.
+ CategoryInfo : SecurityError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : UnauthorizedAccess
我已经尝试设置执行策略Set-ExecutionPolicy -ExecutionPolicy Undefined -Scope LocalMachine
,并且在调用脚本时也尝试绕过它,如下所示:
child = spawn("powershell.exe", ['-ExecutionPolicy ByPass', '-file', "..\\build.ps1", "-devmode"])
这就产生了The term '-ExecutionPolicy' is not recognized as the name of a cmdlet, function, script file, or operable program.
那么,如何才能在不出现执行策略错误的情况下从节点执行此脚本?
3条答案
按热度按时间6ss1mwsb1#
当您使用带有**
-File
参数的WindowsPowerShell CLI(powershell.exe
)直接调用.ps1
脚本文件时,使用**-ExecutionPolicy
CLI参数确实是覆盖脚本文件execution policy的唯一有效方法仅对于给定进程:-ExecutionPolicy Bypass
等同于调用来自PowerShell会话内部的
Set-ExecutionPolicy Bypass -Scope Process -Force
。但是,要从
spawn
调用执行此操作,**每个参数--无论它表示的是参数名称还是值*--都必须作为其自己的数组元素进行传递:至于你尝试了什么:
在您的尝试中,
spawn
必然会将'-ExecutionPolicy Bypass'
包含在结果命令行(在Windows上)的"..."
中,因为其中包含空格。当
powershell.exe
解析生成的命令行时,它无法识别"-ExecutionPolicy Bypass"
被视为试图传递带有值的-ExecutionPolicy
参数;事实上,它根本不将此参数识别为CLI参数,因此默认将其视为PowerShell源代码-即好像它已被传递给默认CLI参数-Command
(-c
)。也就是说,您的尝试实际上等同于从PowerShell会话内部将
-ExecutionPolicy Bypass ...
作为命令提交,这将导致您看到的错误。yrefmtwq2#
qv7cva1a3#
在Windows设置中,导航到
Privacy & Security
>For developers
。然后向下滚动到Powershell
下拉列表。启用“更改执行策略以允许本地PowerShell脚本在没有签名的情况下运行。需要对远程脚本进行签名”。