我想使用select-string
grep
在另一个命令的输出上(类似于在 Unix OS 上的使用方式)。
以下是不带 的命令的输出select-string
:
> (dir resources).Name
wmd-Linux-22022.json
wmd-Linux-22023.json
wmd-Linux-22024.json
wmd-Windows-22022.json
wmd-Windows-22023.json
wmd-Windows-22024.json
当我使用时select-string
,由于某种原因我得到了空白行:
> (dir resources).Name | select-string Windows
wmd-Windows-22022.json
wmd-Windows-22023.json
wmd-Windows-22024.json
我怎样才能(A)告诉 select-string 吃掉没有匹配项的空白行,或者(B)将输出通过管道传输到另一个可以为我吃掉空白行的 powershell 实用程序?
答案1
Select-String 返回 MatchInfo 数组,如下图所示((dir resources).Name | select-string Windows)[0].GetType()
为了得到你想要的结果,只需将整个表达式转换为[string[]]:
[string[]]((dir resources).Name | select-string Windows)
答案2
我找到了一个解决方案:
((dir resources).Name | select-string Windows | out-string).Trim()
out-string
将另一个命令的输入转换为字符串,并且Trim()
是仅对字符串起作用的函数(即,Trim()
对返回某些非字符串类型的命令的输出不起作用)。
答案3
这是一个一体化函数,可以轻松编写列表(作为输出结果),删除空白行,可以通过管道传输。下面显示了 2 个使用示例希望对您有所帮助
function Write-List {
Param(
[Parameter(Mandatory, ValueFromPipeline)][array] $Array,
[string]$Prefixe,
[bool]$Numbering = $False
)
if ($Numbering) {
$NumberOfDigit = $($Array.Count).ToString().Length
$Array | Format-List | Out-String -Stream | ForEach-Object -Process {
if (-not [string]::IsNullOrWhiteSpace($_)) {
"$Prefixe# {0,$NumberOfDigit} : {1}" -f (++$Index), $_
}
}
} else {
$Array | Format-List | Out-String -Stream | ForEach-Object -Process {
if (-not [string]::IsNullOrWhiteSpace($_)) {
"$Prefixe{0}" -f $_
}
}
}
}
示例1:
Write-List @("titi", "toto", "tata", "titi", "toto", "tata", "titi", "toto", "tata", "titi", "toto", "tata") -Numbering $True
# 1 : titi
# 2 : toto
# 3 : tata
# 4 : titi
# 5 : toto
# 6 : tata
# 7 : titi
# 8 : toto
# 9 : tata
# 10 : titi
# 11 : toto
# 12 : tata
示例2:
Get-Service -Name "*openvpn*" | Select-Object DisplayName,Name,Status,StartType | Write-List -Prefixe " - "
- DisplayName : OpenVPN Interactive Service
- Name : OpenVPNServiceInteractive
- Status : Running
- StartType : Automatic