
使いたい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