从c#运行Powershell脚本
我试图从C#代码运行PowerShell脚本,但我遇到了一些(也许是环境)问题:
在我试图运行它的机器上,会发生以下情况:
笔记:
Set-ExecutionPolicy:Windows PowerShell成功更新了您的执行策略,但该设置被在更具体范围内定义的策略覆盖。 由于覆盖,您的shell将保留其当前有效的RemoteSigned执行策略。 键入“Get-ExecutionPolicy -List”查看您的执行策略设置。 有关更多信息,请参阅“Get-Help Set-ExecutionPolicy”。 在行:1 char:46 + if((Get-ExecutionPolicy)-ne'AllSigned'){Set-ExecutionPolicy -Scope Process ... + ~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ CategoryInfo:PermissionDenied:()[Set-ExecutionPolicy],SecurityException + FullyQualifiedErrorId:ExecutionPolicyOverride,Microsoft.PowerShell.Commands.SetExecutionPolicyCommand
Get-ExecutionPolicy -List
Scope ExecutionPolicy
----- ---------------
MachinePolicy Unrestricted
UserPolicy Undefined
Process Bypass
CurrentUser Unrestricted
LocalMachine Unrestricted
我相信这是环境因素:
这是我用来调用脚本的代码:
if (File.Exists("Start.ps1"))
{
string strCmdText = Path.Combine(Directory.GetCurrentDirectory(), "Start.ps1");
var process = System.Diagnostics.Process.Start(@"C:windowssystem32windowspowershellv1.0powershell.exe ", strCmdText);
process.WaitForExit();
}
脚本本身并不重要,因为我已将它改为简单
Write-Host "Hello"
$d=Read-Host
和我有同样的问题。
问题出在脚本的路径上。 它在这台机器上有空间,我没有处理。
窗户关闭太快,看不到任何错误,但设置
process.StartInfo.RedirectStandardOutput = true;
帮我抓住了它。
执行政策与我的错误没有任何关系。
为了解决这个问题,我改变了C#代码的路径,就像这里解释的一样:在CMD.EXE中从一个位置用“非法字符在路径中”执行一个Powershell脚本
完整的代码:
if (File.Exists("Start.ps1"))
{
File.GetAttributes("Start.ps1");
string strCmdText = Path.Combine(Directory.GetCurrentDirectory(), "Start.ps1");
var process = new Process();
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.FileName = @"C:windowssystem32windowspowershellv1.0powershell.exe";
process.StartInfo.Arguments = ""&'"+strCmdText+"'"";
process.Start();
string s = process.StandardOutput.ReadToEnd();
process.WaitForExit();
using (StreamWriter outfile = new StreamWriter("StandardOutput.txt", true))
{
outfile.Write(s);
}
}
当您列出这些策略时,显然存在针对您的计算机实施的组策略(即使它不在域中,仍然存在本地GP),这会将MachinePolicy
首先是本地设置的策略)更改为“RemoteSigned”,即在代码执行方面比“无限制”更强大的策略。 如果您的PC在一个域中,您可以运行“结果设置策略(日志记录)”作为本地管理员,并获取影响您PC的域策略。 如果没有,请从控制面板/管理工具运行本地安全策略并浏览“计算机配置 - 管理模板 - Windows组件 - Windows PowerShell”并检查策略的值(“启用场景执行” - 粗略翻译为本地化),并且如果需要的话,你可以改变那里的值。 做完之后,重新加载Powershell。
上一篇: Running a Powershell script from c#
下一篇: Unable to run powershell script on all machines in network from server machine