我正在尝试执行CMD命令并将命令的结果流式传输到流写入器。原因是我尝试筛选的日志文件每个高达 1gb,将结果存储到变量中很容易耗尽几千兆内存。我也想向StreamWriter表示赞赏,因为它的表演很漂亮。
这是我剧本的摘录。
$StreamWriter = [System.IO.StreamWriter] "test.txt"
$SearchString = "2016_06_*"
$SearchLogs = "2016_*.log"
"CMD /C gunzip.exe -c $SearchLogs |grep -i `"$SearchString`"" | $StreamWriter.WriteLine($_)
$StreamWriter.Flush()
$StreamWriter.Close()
- 不要混合使用CMD和PowerShell。使用其中之一。我上次已经告诉过你了。
- 不要再使用 PowerShell v1。任何仍然受支持的Windows系统至少可以运行PowerShell v2。立即升级。
- 您不需要CMD即可从PowerShell运行可执行文件。我也告诉过你。
- 如果将命令行放在引号中,PowerShell将仅回显它,而不是执行它。
- 要过滤通配符匹配项,请使用
-like
运算符。 - 流编写器不从管道读取。您需要将它们包装在
ForEach-Object
语句中。
$StreamWriter = [IO.StreamWriter]'test.txt'
$SearchString = "2016_06_*"
$SearchLogs = "2016_*.log"
gunzip.exe -c $SearchLogs |
Where-Object { $_ -like $SearchString } |
ForEach-Object { $StreamWriter.WriteLine($_) }
$StreamWriter.Flush()
$StreamWriter.Close()