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服务,并将结果输出到控制台。
最佳实践
- 脚本安全性:在执行任何PowerShell脚本之前,确保脚本来自可信来源,以避免执行恶意代码。
- 错误处理:在PowerShellScriptRunner类中,我们已经包含了基本的错误处理逻辑。然而,在实际应用中,根据脚本的具体用途,可能需要进一步扩展错误处理机制,以确保应用程序的稳定性。
- 性能考虑:虽然调用PowerShell脚本为自动化任务提供了便利,但也要注意不要过度使用,特别是在性能敏感的应用程序中。合理安排脚本执行的频率和时间,以避免对系统性能造成不必要的影响。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
2021-09-18 九、Abp vNext 基础篇丨评论聚合功能
2020-09-18 知识全聚集 .Net Core 技术突破 | 如何实现一个模块化方案一