奇怪的IO流重定向事件

时间:2013-06-17 18:24:47

标签: powershell io-redirection redirectstandardoutput

我正在使用DISM.exe(部署映像服务和管理工具)重新映像计算机。我的老板要我为这个实用程序创建一个更好看的UI。我这样做的计划是重新指导DISM的输出,解析dism显示的“进度条”,以便我可以提取完成百分比,然后将其转换为浮点数以便在我自己的UI中使用。

在我开始测试之前,这一切看起来都很顺利。 DISM输出看起来像这样:

Deployment Image Servicing and Management tool
Version: 6.2.9200.16384

Applying Image
[=================          36.7%                     ]

然而,我的powershell脚本没有提取36.7因为它应该如此进一步调试我取出了所有的解析代码,所以我的所有代码都只是简单地将输出直接重定向到屏幕。

当我这样做并重新运行dism时,输出看起来很相似,除非现在根本没有进度条。

所以基本上,似乎dism.exe的进度条部分没有使用标准的print方法将它回显到屏幕,因为我的脚本没有看到StreamReader.ReadLine()调用中的进度条我我正在用来获得输出。

有谁知道为什么会这样,以及如何更改我的脚本以便它也能成功读取进度条?

以下是源代码:

write-host "Initializing dism process..."
$processInfo = new-object System.Diagnostics.ProcessStartInfo

$processInfo.FileName = "dism.exe"
$processInfo.UseShellExecute = $false
$processInfo.RedirectStandardOutput = $true
$processInfo.Arguments = "/Apply-Image /ImageFile:C:\images\Win864_SL-IN-837.wim /ApplyDir:D:\ /Index:1"

$process = new-object System.Diagnostics.Process
$process.StartInfo = $processInfo

write-host "Starting up dism..."
$process.Start();

$stream = $process.StandardOutput
$str = ""

if($stream -ne $null){

    write-host "Found output stream..."

    while($str -ne $null)
    {
        $str = $stream.ReadLine()     
        write-host $str

    }
}


write-host "Stopping interception..."

0 个答案:

没有答案