当然不要忘记,官网才是最好的老师:docs.microsoft.com/zh-cn/dotnet/core/
沙盒学习指南: 免费环境docs.microsoft.com/zh-cn/learn/browse
posted @ 2020 初久的私房菜 推荐出品

C# 在Windows系统下 通过 PowerShell 调用Python库进行交互

 

正文

PwoerSheel调用代码

场景介绍

假设你是一名软件开发人员,正在开发一个需要自动化执行一系列系统管理任务的应用程序。这些任务可能包括创建用户账户、安装软件、配置网络设置等。使用PowerShell脚本可以轻松完成这些任务,但你的应用程序是用C#编写的。这时,你就需要一种方法来从C#代码中调用PowerShell脚本。

解决方案

为了实现这一目标,我们可以创建一个名为PowerShellScriptRunner的类,该类封装了调用PowerShell脚本所需的逻辑。下面是一个简化的实现:

  public class PowerShellScriptRunner
  {
      public static async Task<string> ExecutePowerShell(string workDirectory, string command, string outputIndicator)
      {
          var processInfo = new ProcessStartInfo
          {
              FileName = "powershell.exe",
              Arguments =
                  $"-ExecutionPolicy Bypass -Command \"{command}\"",
              RedirectStandardOutput = true,
              RedirectStandardError = true,
              UseShellExecute = false,
              CreateNoWindow = true,
              WorkingDirectory = workDirectory
          };

          using var process = new Process();
          process.StartInfo = processInfo;
          process.Start();

          try
          {
              await process.WaitForExitAsync(new CancellationTokenSource(10000).Token);
          }
          catch (TaskCanceledException e)
          {
              var error = string.Empty;
              try
              {
                  error = await process.StandardError.ReadToEndAsync();
              }
              catch (Exception)
              {
                  // ignored
              }

              return default;
          }

          if (process.ExitCode < 0)
          {
              string errors = await process.StandardError.ReadToEndAsync();
              throw new Exception(errors);
          }
          else
          {
              var processOutput = process.StandardOutput;

              if (string.IsNullOrEmpty(outputIndicator)) return await processOutput.ReadToEndAsync();

              while (await processOutput.ReadLineAsync() is { } block)
              {
                  if (block == outputIndicator)
                  {
                      return await processOutput.ReadToEndAsync();
                  }
              }
              return await processOutput.ReadToEndAsync();

          }
      }

  }

外部使用代码

PowerShellScriptRunner.ExecutePowerShell(启动PowerSheel窗口的路径, 需要执行的脚本代码, "");

使用场景

场景一:自动化软件部署

在现代软件开发过程中,自动化部署是提高效率和减少人为错误的关键。使用PowerShellScriptRunner,开发团队可以编写PowerShell脚本来自动化其软件部署过程,例如,自动化下载最新的软件包、更新数据库、配置服务等。这样,开发人员只需执行一个C#方法调用,整个部署过程就可以自动完成。

场景二:系统监控和日志收集

对于系统管理员来说,监控系统的健康状况和收集日志信息是日常工作的一部分。通过PowerShellScriptRunner,管理员可以编写脚本来检查系统状态、收集日志文件并发送到中央日志服务器。这个过程可以完全自动化,大大减轻了管理员的工作负担。

示例

假设我们需要编写一个PowerShell脚本来检查Windows服务的状态,并且我们想从C#应用程序中调用这个脚本。以下是如何使用PowerShellScriptRunner来实现这一点的示例:

string workDirectory = @"C:\Scripts";
string command = "Get-Service | Where-Object {$_.Status -eq 'Running'}";
string outputIndicator = "";

var runningServices = await PowerShellScriptRunner.ExecutePowerShell(workDirectory, command, outputIndicator);
Console.WriteLine("正在运行的服务:");
Console.WriteLine(runningServices);

这个示例展示了如何从C#中调用PowerShell脚本来获取所有正在运行的Windows服务,并将结果输出到控制台。

最佳实践

  1. 脚本安全性:在执行任何PowerShell脚本之前,确保脚本来自可信来源,以避免执行恶意代码。
  2. 错误处理:在PowerShellScriptRunner类中,我们已经包含了基本的错误处理逻辑。然而,在实际应用中,根据脚本的具体用途,可能需要进一步扩展错误处理机制,以确保应用程序的稳定性。
  3. 性能考虑:虽然调用PowerShell脚本为自动化任务提供了便利,但也要注意不要过度使用,特别是在性能敏感的应用程序中。合理安排脚本执行的频率和时间,以避免对系统性能造成不必要的影响。
posted @   初久的私房菜  阅读(7252)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
历史上的今天:
2021-09-18 九、Abp vNext 基础篇丨评论聚合功能
2020-09-18 知识全聚集 .Net Core 技术突破 | 如何实现一个模块化方案一
作者:初久的私房菜
好好学习,天天向上
返回顶部小火箭
好友榜:
如果愿意,把你的博客地址放这里
张弛:https://blog.zhangchi.fun/
点击右上角即可分享
微信分享提示