我很难找到一种在C#中执行多行多语句C#脚本的方法,这样所有的结果都可以从Invoke()方法中获得。看来,PowerShell.AddScript添加的命令始终是流水线化的。但是,我希望它们作为多个语句被读取、解析和执行,并将各个语句的所有结果写入输出。
这有可能吗?
我现在做的是:
using PowerShell powerShell = PowerShell.Create();
powerShell.AddCommand("Set-ExecutionPolicy").AddArgument("Unrestricted").AddParameter("Scope", "CurrentUser").AddStatement();
powerShell.AddScript(@"multiple powershell statements
on multiple rows, some of them writing to output"); //No intermediate results will be logged or printed as the script is added as a single pipeline
powerShell.AddScript("$?"); //This is to echo the execution status of the last command into results
var results = powerShell.Invoke();
结果集合只包含一个结果,即最后一个$的回波?语句,然后查询该语句以查找pass/ find信息。我还查询错误流,但这与问题无关。
问题是:作为用户输入接收PowerShell脚本,因此不能修改它并将其添加为语句。我正在考虑逐行添加脚本,但它会破坏可能的多行管道、代码块等。因此,要达到我想要的结果,我需要自己解析脚本,这听起来很复杂。是否有任何优雅的解决方案来接收调用()的所有结果,最重要的是,从用户输入中添加一个复杂的脚本,而不会将它作为一个管道压在一起,将一个命令的结果提供给另一个?
发布于 2020-03-31 12:12:10
简单地说,$?
使用字符串连接将语句追加到所接收的语句,并在此之前加上;
(语句分隔符):
powerShell.AddScript(@"multiple powershell statements
on multiple rows, some of them writing to output" + ";$?");
这样,所有语句都作为一个脚本block提交。
.AddScript()
调用不是累积的--最后一次“获胜”。
或者,将.AddStatement()
.AddScript()
附加到每个.AddScript()
调用中,类似于您已经对更改执行策略的.AddCommand()
调用所做的操作。
但是,使用单一的.AddScript()
调用,只传递单的PowerShell代码段更为有效,如上面所示。
最后,强制的安全警告
我接收PowerShell脚本作为用户输入
除非首先检查输入并对其进行消毒,否则只有在信任源的情况下才执行它。
https://stackoverflow.com/questions/60949050
复制相似问题