首先,我只学习了大约一周的 Powershell,主要是调整 Linux 脚本以在我的(更强大的)Windows 机器上运行。所以,请善待行话。
我正在尝试编写一个脚本,该脚本在写入时解析由另一个命令写入标准输出的字符串数据流。正在写入的数据量大且冗长,最好在写入时对其进行处理,而不是将其写入文本文件然后再进行处理。
输出是带有换行符的 ASCII 字符串(或者是 Windows,也可能是回车)。这实际上是我想做的事情:
foreach ($i in (ffprobe -i "$sourceFile" -show_frames))
{
if ("$i".Substring(0,1) -eq "[" -and "$i".Substring(1,1) -ne "/")
{
echo "$i".Substring(0,1)
echo "$i".Substring(1,1)
echo "$i"
<do other stuff>
}
}
该ffprobe -i "$sourceFile" -show_frames
命令输出文本,例如:
[FRAME]
DATA1
DATA1
[/FRAME]
基本上,我想将写入标准输出的数据视为“while 循环”,直到没有更多内容被写入。我一次只需要解析一行数据。总而言之,我预计输出的行数将在 5 到 1000 万行之间。
仅供参考,我的机器应该能够处理大量数据。我有双 Xeon E5 v3 12 核(24 w/超线程)和 128GB RAM。当我处理数据时,大约每 10-15 行输出将被处理并写入一个文本文件 - 尽管我可能会创建一个缓冲区变量来将处理后的输出写入并将其刷新到每几千行输出的文件中。
提前感谢您的一些指导。
以下解决了我的问题。我不知道它是否是最有效的,但它对我有用。如果你有更有效的方法,我欢迎。
*********** 更新 2020-04-12 ***********
事实证明,我不需要使用 WSL——这只是我发现的第一个解决方案。上面的解决方案在不使用或不使用的情况下都可以正常工作
wsl
(此外,您还可以避免与将 Windows 文件传递给 WSL 相关的可能的命名问题)。因此,在这种情况下不需要 WSL。最初,当我在 Powershell 中测试方法时,我认为它由于语法错误而失败。具体来说,以下设置失败:请注意,左括号
{
与命令ForEach-Object
不在同一行,ForEach-Object
而是在下一行。由于我不知道的原因,Powershell 脚本会失败。但是,当像上面的解决方案那样设置时,没有wsl
左ForEach-Object
大括号{
在同一行,管道输入到循环中没有问题。因此,为了彻底起见,以下是没有wsl
外观的解决方案: