实时在控制台上或在PowerShell中使用其他应用程序输出 尤其是这是我的主要问题:

如何解决实时在控制台上或在PowerShell中使用其他应用程序输出 尤其是这是我的主要问题:

'我已经构建了一个PowerShell脚本,可以实时处理MS Windows可执行程序集(* .exe)的输出。

诸如“ WaitForExit()”之类的方法不在范围内,因为此类方法将阻止事件/输出! 使用此类方法只会在退出后显示结果。 (可以使用“ ping.exe”轻松进行测试)

也许有人可以进行一些其他改进,以避免我的通用脚本出现意外行为。尤其是对于特定的可执行文件。

尤其是(这是我的主要问题):

使用7z.exe检查档案的完整性时,如何获取(按事件)主机更新: 例如 7z t "D:\<someBigArchive.7z"

->在CMD中,我得到了正在运行的进程的百分比,但没有该脚本的信息。

当应用程序向控制台写入新行时,所有其他实时输出正常工作。

这是我当前的PS脚本:

param(
    [string] $appFilePath = 'ping.exe',[string] $appArguments = 'google.com',[string] $appWorkingDirPath = '',[int] $consoleOutputEncoding = 850 # 850 = default windows console output encoding (useful for e.g 7z.exe). use "<=0" for host's default encooding.
)


if (!$consoleOutputEncoding -le 0) {
    [Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding($consoleOutputEncoding)
}


$eventScriptBlock = {
    # received app output
    $receivedAppData = $Event.SourceEventArgs.Data

    # Write output as stream to console in real-time (without -stream parameter output will produce blank lines!)
    #   (without "Out-String" output with multiple lines at once would be displayed as tab delimited line!)
    Write-Host ($receivedAppData | Out-String -Stream)

    <#
        < Insert additional real-time processing steps here.
        < Since it''s in an entirely different scope (not child),variables of parent scope won't be populated to that child scope and scope "$script:" won't work as well. (scope "$global:" would work but should be avoided!)
        < Modify/Enhance variables "*MessageData" (see below) before registering the event to access such variables.
    #>

    # add received data to stringbuilder definded in $stdOutEventMessageData and $stdErrEventMessageData
    $Event.MessageData.outStringBuilder.AppendLine($receivedAppData)
}


# MessageData parameters for default events (used for event input and output)
$stdOutEventMessageData = @{
    # used for adding output within events to stringbuilder (OUT) for further usage
    outStringBuilder = [System.Text.StringBuilder]::new()

    #< add additional properties if necessary. Can be used as input and output in $eventScriptBlock ($Event.MessageData.*)
    #< ....
}


# MessageData parameters for error events (used for event input and output)
$stdErrEventMessageData = @{
   # used for adding output within events to stringbuilder (OUT) for further usage
    outStringBuilder = [System.Text.StringBuilder]::new()

    #< add additional properties if necessary. Can be used as input and output in $eventScriptBlock ($Event.MessageData.*)
    #< ....
}


#######################################################
#region Process-Definition,-Start and Event-Subscriptions (Adaptions in that region should be avoided!)
#------------------------------------------------------
try {

    $appProcess = [System.Diagnostics.Process]::new()
    $appProcess.StartInfo = @{
        Arguments              = $appArguments
        WorkingDirectory       = $appWorkingDirPath
        FileName               = $appFilePath # mandatory
        RedirectStandardOutput = $true # mandatory = $true
        RedirectStandardError  = $true # mandatory = $true
        #< RedirectStandardInput  = $true # leave commented; only useful in some circumstances. Didn''t find any use,but mentioned in: https://stackoverflow.com/questions/8808663/get-live-output-from-process
        UseShellExecute        = $false # mandatory = $false
        CreateNoWindow         = $true # mandatory = $true
    }

    $stdOutEvent = Register-ObjectEvent -InputObject $appProcess -Action $eventScriptBlock -EventName 'OutputDataReceived' -MessageData $stdOutEventMessageData
    $stdErrEvent = Register-ObjectEvent -InputObject $appProcess -Action $eventScriptBlock -EventName 'ErrorDataReceived' -MessageData $stdErrEventMessageData

    [void]$appProcess.Start()
    $appProcess.BeginOutputReadLine()
    $appProcess.BeginErrorReadLine()

    while (!$appProcess.HasExited) {
        # Don't use method "WaitForExit()"! This will not show the output in real-time as it blocks the output stream!
        #   using "Sleep" from System.Threading.Thread class for short sleep times below 1/1.5 seconds is better than "Start-Sleep" in terms of PS overhead/performance on init (Test it yourself)
        #   (sleep will block console output --> don't set too high; but also not too low for performance reasons in long running actions)
        [System.Threading.Thread]::Sleep(250)

        #< maybe timeout ...
    }

} finally {
    if (!$appProcess.HasExited) {
        $appProcess.Kill() # WARNING: Entire process gets killed! Review and adapt!
    }

    if ($stdOutEvent -is [System.Management.Automation.PSEventJob]) {
        Unregister-Event -SourceIdentifier $stdOutEvent.Name
    }
    if ($stdErrEvent -is [System.Management.Automation.PSEventJob]) {
        Unregister-Event -SourceIdentifier $stdErrEvent.Name
    }
}
#------------------------------------------------------
#endregion
#######################################################


$stdOutText = $stdOutEventMessageData.outStringBuilder.ToString() # final output for further usage
$stErrText = $stdErrEventMessageData.outStringBuilder.ToString()  # final errors for further usage

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-