
我想用select-string
在另一個命令的輸出上(類似於grep
在 Unix 作業系統上使用的方式)。
這是不帶 的命令的輸出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