Powershell:Select-String无法解析此变量

3

我是一名PowerShell新手。我在尝试让Select-String解析以下变量时卡住了。

我正在调用一个外部程序,该程序将所有内容记录到标准输出中。这是我使用的备份同步软件。输出包括源,目标,已复制的文件,更改的文件等大量信息。我只关心标准输出中的几个项目。我将标准输出取出并尝试解析我关心的少数项目,以便我只看到这些项目,而不是其他50行的杂项信息。

以下是代码:

$procInfo = New-Object System.Diagnostics.ProcessStartInfo
$procInfo.FileName = "C:\Program Files\Siber Systems\GoodSync\gsync.exe"
$procInfo.RedirectStandardError = $true
$procInfo.RedirectStandardOutput = $true
$procInfo.UseShellExecute = $false
$procInfo.Arguments = "/progress=yes /exit sync DroboBackup"
$proc = New-Object System.Diagnostics.Process
$proc.StartInfo = $procInfo
$proc.Start() | Out-Null
(Get-Date -format T) + ": Backup Process Running. Please Stand By..."
$proc.WaitForExit()
if ($proc.ExitCode -eq 0) 
{ 
    "GoodSync Reported: Analyze or Sync Successfully Completed." 
} elseif ($proc.ExitCode -eq 1)
{
    "GoodSync Error: Analyze had Terminal Errors. Did gsync.exe close abruptly?"
} elseif ($proc.ExitCode -eq 2)
{
    "GoodSync Error: Sync had Terminal Errors. Did gsync.exe close abruptly?"
} else 
{ 
    "GoodSync Error: General Error. Typo in job name?"
}
$output = $proc.StandardOutput.ReadToEnd()
$output += $proc.StandardError.ReadToEnd()
#$output  | Out-File c:\output.txt -Append
$newOutput = $output | Select-String "Copy New","Copy Over","Delete File","Items Synced","Changes:"
$newOutput

运行后我得到的是来自标准输出流的所有行,而不是我期望的整洁解析的返回结果。

为了尝试排查问题,我将$output发送到文本文件中,然后运行下面的命令,这是我得到的结果:

$x = Get-Content c:\output.txt | Select-String "Copy New","Copy Over","Delete File","Items Synced","Changes:"
$x

PS C:\> .\test.ps1

Changes: 0, Conflicts: 0, CopyTime: 0, CopyState: 0/0, Errors: 0

所以你可以看到,它可以对文本文件起作用,但不能对变量起作用。
有什么见解吗?
1个回答

5
您正在使用StreamReaderReadToEnd()方法读取标准输出。此方法将返回一个包含内容(包括回车符)的单个字符串。因此,当您在管道上输出此字符串时,Select-String仅看到一个大字符串,而不是每个单独的行。您可以在将其传递到管道之前,将字符串拆分为回车符:
$output -split "`n" | Select-String "Copy New","Copy Over","Delete File","Items Synced","Changes:"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接