優勢
- 無需構造 `powershell.exe -File ...` 命令行,避免參數轉義麻煩。
- 直接在進程內託管 PowerShell 運行空間,性能更好、交互更靈活。
- 原生支持參數字典傳遞、錯誤流捕獲、結果序列化。
核心代碼
using System.Management.Automation;
using System.Collections.Generic;
using System.Text;
public bool RunScript(string scriptPath, IDictionary parameters,
out string output, out string error) {
output = error = null;
using (var ps = PowerShell.Create()) {
ps.AddCommand(scriptPath);
ps.AddParameters(parameters); // 參數自動綁定
var results = ps.Invoke();
var errors = ps.Streams.Error;
var sb = new StringBuilder();
if (errors.Count > 0) {
foreach (var err in errors) sb.Append(err);
error = sb.ToString();
} else {
foreach (var r in results) sb.AppendLine(r?.ToString());
output = sb.ToString();
}
return errors.Count == 0;
}
}
關鍵點
- `AddCommand` 接受腳本完整路徑(`.ps1` 文件)。
- `AddParameters` 接受 `IDictionary`(如 `Hashtable` 或 `Dictionary`),鍵對應腳本 `param()` 參數名。
- `ps.Streams.Error` 包含非終止錯誤,終止錯誤會拋出異常(可用 `try-catch` 捕獲)。
- 需引用 `System.Management.Automation.dll`(NuGet 包 `Microsoft.PowerShell.SDK`)。
調用示例
var args = new Dictionary<string, object> {
{ "Server", "db01" },
{ "BackupPath", @"D:\Backups" }
};
RunScript(@"C:\Scripts\Backup.ps1", args, out var outStr, out var errStr);