c# - 从 C# Write-Verbose 运行 PowerShell 模块只能运行一次
问题描述
我正在创建一个调用 powershell 脚本的 C# 程序。我正在使用'write-verbose'从powershell模块脚本中给我实时更新,但是由于某种原因,当脚本从c#代码运行时,我只使用第一个详细消息,而在第一个'Invoke之后没有任何消息-快思聪命令”。“Invoke-CrestronCommand”来自第 3 方库,因此我无法控制函数中的内容。
如果我通过 Powershell ISE 调用脚本,它工作正常。除了这个问题之外,模块在 C# 中运行良好(第二个函数调用有效)除此之外,如果我使用“write-output”,我会将所有信息返回到 c# 代码中,但只有在整个脚本完成之后。
任何建议都非常感谢。
这是powershell模块:
# minimum required version
# Requires -Version 4
Set-StrictMode -Version Latest
# import the module
Import-Module PSCrestron
# --------------------------------------------------------
function UpdateFirmware
# ---------------------------------------------------------
{
[CmdletBinding()]
Param
(
[Parameter(Mandatory=$true)]
[object]$Devices,
[Parameter(Mandatory=$true)]
[object]$FwPath,
[Parameter(Mandatory=$true)]
[object]$Username,
[Parameter(Mandatory=$true)]
[object]$Password
)
$VerbosePreference = 'Continue'
try
{
foreach($Device in $Devices) {
Write-Verbose "OUTPUT=$($Device.DeviceModel) $($Device.IpAddress) $($Device.MacAddress) TRANSFERRING"
$result = Invoke-CrestronCommand -Device $Device.IpAddress -Command "fget <ftp server path> \\romdisk\\user\\system\\rmc4_2.6000.00026.puf admin:password" -Secure -Username $Username -Password $Password -Timeout 300
Write-Verbose "OUTPUT=$($Device.DeviceModel) $($Device.IpAddress) $($Device.MacAddress) TRANSFER_RESULT:$($result)"
$result2 = Invoke-CrestronCommand -Device $Device.IpAddress -Command "puf" -Secure -Username $Username -Password $Password -Timeout 20
Write-Verbose "OUTPUT=$($Device.DeviceModel) $($Device.IpAddress) $($Device.MacAddress) PUF_RESULT:$($result2)"
}
}
catch {
Write-Output "OUTPUT=$($Device.DeviceModel) $($Device.IpAddress) $($Device.MacAddress) ERROR:$($PSItem.Exception.Message)"
}
}
Export-ModuleMember -Function * -Alias * -Variable *
这是 C# 代码:
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Management.Automation;
namespace PowerShellScriptTest {
class Device {
public string IpAddress { get; set; }
public string MacAddress { get; set; }
public string DeviceModel { get; set; }
}
class Program {
static void Main(string[] args) {
var devices = new List<Device>() {
new Device() {IpAddress = "192.168.0.104", MacAddress = "00:00:00:00:00:01", DeviceModel = "RMC4"},
new Device() {IpAddress = "192.168.0.110", MacAddress = "00:00:00:00:00:02", DeviceModel = "RMC4"}
};
using (PowerShell powerShell = PowerShell.Create()) {
powerShell.AddScript(
"Import-Module C:\\FirmwareUpdateTest.psm1");
powerShell.AddScript(
@"UpdateFirmware -Devices $args[0] -FwPath $args[1] -Username $args[2] -Password $args[3]")
.AddArgument(devices)
.AddArgument("path")
.AddArgument("admin")
.AddArgument("password");
powerShell.Streams.Verbose.DataAdded += Verbose_DataAdded;
Collection<PSObject> PSOutput = null;
try {
PSOutput = powerShell.Invoke();
}
catch (Exception ex) {
Console.WriteLine("ERROR!");
}
if (PSOutput == null) {
return;
}
foreach (PSObject outputItem in PSOutput) {
if (outputItem != null) {
Console.WriteLine($"{outputItem.ToString()}\r\n");
}
}
}
Console.ReadLine();
}
private static void Verbose_DataAdded(object sender, DataAddedEventArgs e) {
var streamObjectsReceived = sender as PSDataCollection<VerboseRecord>;
var currentStreamRecord = streamObjectsReceived[e.Index];
if (currentStreamRecord.Message.ToLower().Contains("output")) {
var resultArray = currentStreamRecord.Message.Split(new string[] { "=" }, StringSplitOptions.None);
Console.WriteLine($"{resultArray[1]}\r\n");
}
}
}
}
解决方案
推荐阅读
- javascript - 在 javascript [Node JS] 中以 json 格式访问 http 请求
- legend - Plotly.js 是否可以在图表之外绘制标记符号?
- javascript - store.getState 不是函数 react-redux
- flutter - 为什么我收到错误,flutter statfulwidget flutter 中的常量值无效
- laravel - 如何在 laravel 中重试 db 事务?
- python - 基于多个列表在 Dataframe 中创建新列
- c - 在 Windows 中使用 PDCurses 时如何处理 SIGINT (Ctrl+C)
- c++ - 是否可以将 std::unique_ptr 移动到自身?
- html - 如何对齐多个 img 和单选按钮内联?
- python - 编辑列以等于其第一个值