配列を出力しようとしています(forループと.ToString()
を直接使用してみました)が、常にSystem.Object
出力。
配列の内容はこのコマンドの結果です:
$singleOutput = Invoke-Command -ComputerName $server -ScriptBlock {
Get-ChildItem C:\*.txt -Recurse |
Select-String -Pattern "password" -AllMatches
}
これは私が得ている出力です:
System.Object []
私は何が欠けていますか?
編集:
これは機能全体です。
foreach ($server in $servidores) {
$result = @()
Write-Output ("---Searching on Server:---" + $server + "----at:" +
(Get-Date).ToString() + "----")
$singleOutput = Invoke-Command -ComputerName $server -ScriptBlock {
Get-ChildItem C:\*.txt -Recurse |
Select-String -Pattern "password" -AllMatches
}
$result += $singleOutput
Write-Host $result.ToString()
}
Read-Host -Prompt "Press Enter to exit"
私も試しました:
foreach ($i in $result) {
$result[$i].ToString()
}
MatchInfo
オブジェクトを生成するSelect-String
を使用しています。ファイルの一致する行全体が必要なように見えるため、おそらくLine
オブジェクトのMatchInfo
プロパティの値のみを返す必要があります。また、配列の処理は非常に複雑です。 Invoke-Command
が返すものをすべて出力し、ループ出力を変数にキャプチャします。ループ内のステータス出力にはWrite-Host
を使用して、$result
にメッセージがキャプチャされないようにします。
$result = foreach ($server in $servidores) {
Write-Host ("--- Searching on Server: $server at: " + (Get-Date).ToString())
Invoke-Command -ComputerName $server -ScriptBlock {
Get-ChildItem C:\*.txt -Recurse |
Select-String -Pattern "password" -AllMatches |
Select-Object -Expand Line
}
}
ホスト名も必要な場合は、 計算プロパティ でホスト名を追加し、カスタムオブジェクトを返すことができます。
$result = foreach ($server in $servidores) {
Write-Host ("--- Searching on Server: $server at: " + (Get-Date).ToString())
Invoke-Command -ComputerName $server -ScriptBlock {
Get-ChildItem C:\*.txt -Recurse |
Select-String -Pattern "password" -AllMatches |
Select-Object @{n='Server';e={$env:COMPUTERNAME}},Line
}
}
配列変数をエコーするだけで配列を出力します。
PS C:\> $ result サーバー回線 ------ ---- ... ...
カスタム形式の出力を取得するには、たとえば format operator (-f
)を使用できます。
$result | ForEach-Object {
'{0}: {1}' -f $_.Server, $_.Line
}