执行进程并在其输出中查找行

执行进程并在其输出中查找行

如何执行一个进程并在其输出中找到包含特定搜索文本的行?我需要找到两个不同的模式,第一个模式,如果不存在则找到另一个模式,然后使用同一行中的值。

我尝试执行如下过程:

$lines = (youtube-dl --list-formats $url) |out-string

该命令打印如下内容:

[youtube] 5qap5aO4i9A: Downloading webpage
[youtube] 5qap5aO4i9A: Downloading m3u8 information
[youtube] 5qap5aO4i9A: Downloading MPD manifest
[info] Available formats for 5qap5aO4i9A:
format code  extension  resolution note
91           mp4        256x144     290k , avc1.42c00b, 15.0fps, mp4a.40.5
92           mp4        426x240     546k , avc1.4d4015, 30.0fps, mp4a.40.5
93           mp4        640x360    1209k , avc1.4d401e, 30.0fps, mp4a.40.2
94           mp4        854x480    1568k , avc1.4d401f, 30.0fps, mp4a.40.2
95           mp4        1280x720   2969k , avc1.4d401f, 30.0fps, mp4a.40.2
96           mp4        1920x1080  5420k , avc1.640028, 30.0fps, mp4a.40.2 (best)

我不知道那是什么,是单个多行字符串还是行数组,我找不到。但这些经常被引用的方法都不起作用:我要么什么也得不到,要么一次得到所有行。

$lines |where { $_ -like "*1280x720*" }
$lines |where { $_ -like "1280x720" }
@($lines) -match "1280x720"

我正在寻找“1280x720”以及作为后备的“(最佳)”。

在匹配的行中,如果存在,我只需要该行的第一个数字。在这种情况下,这将是“95”或“96”。这如何在 PowerShell 中工作?我可以在 Bash 中轻松完成,并且知道 CMD 无法帮助我。

(这里显示的所有代码都是从网上收集的。我永远不会理解 PowerShell 语法,我很乐意坚持使用 C# 和 Bash;PowerShell 在我看来是难以理解的。在 PS 中让某些东西工作起来比为其编写 C 程序花费的时间更长。)

答案1

请尝试以下操作:

youtube-dl --list-formats $url | Select-String "1280x720"

我正在使用选择字符串cmdlet 如下:

使用正则表达式匹配在输入字符串和文件中搜索文本模式。您可以使用类似于 UNIX 中的 grep 或 Windows 中的 findstr.exe 的 Select-String。

youtbut-dl 的输出将通过管道传输到 Select-String,后者将选择符合条件的行。

答案2

删除并循环遍历使用来匹配或 的| Out-String行数组:switch1280x720best

$lines = (youtube-dl --list-formats $url)
switch -Regex ($lines) {
    '1280x720|best' { 
        # return the number in the first column
        ($_ -split '\s+')[0]
    }
}

使用您的示例行,这将返回

95
96

相关内容