我有一个Powershell命令,可以输出多行。
我只想输出包含.zip文件名称的一行。
当前,当找到子字符串InvalidationListener
时,返回所有行:
.zip
答案 0 :(得分:2)
由于您使用的是.ReadToEnd()
,因此$output
会收到一个一个多行字符串,而不是一个行数组。
因此,您必须使用-split
运算符自己将该字符串分成几行。
然后,您可以将字符串比较运算符(例如-match
或-like
直接应用于行数组以提取匹配的行:
# Sample multi-line string.
$output = @'
line 1
foo.zip
another line
'@
$output -split '\r?\n' -match '\.zip' # -> 'foo.zip'
-split
是基于正则表达式的,而正则表达式\r?\n
可以匹配两种变体的换行符(换行符)(在Windows中通常使用CRLF,在Unix-中通常使用LF-平台)。
-match
也是基于正则表达式的,这就是为什么.
中的\.zip
被转义的原因是\
regex元字符(默认情况下,它匹配LF以外的任何其他字符)。
.
与一般的PowerShell一样,默认情况下不区分大小写 ,因此-match
和foo.zip
都将匹配;例如< br />
如果您确实希望区分大小写,请使用foo.ZIP
。顺便说一句:
我不知道您为什么要通过-cmatch
实例运行命令,因为您似乎在捕获其标准流时正在同步调用。
PowerShell允许您通过直接调用(可以选择使用重定向)来更简单地完成此操作:
[System.Diagnostics.Process]