首页 > 解决方案 > 从 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");
            }
        }
    }
}

标签: c#powershellmoduleverbose

解决方案


推荐阅读