在Powershell中打印数组

Ale*_*ise 16 arrays powershell

我正在尝试打印一个数组(我尝试使用for循环并直接使用.ToString()),但我总是得到一个System.Object输出.

数组的内容是此命令的结果:

$singleOutput = Invoke-Command -ComputerName $server -ScriptBlock {
    Get-ChildItem C:\*.txt -Recurse |
        Select-String -Pattern "password" -AllMatches
}
Run Code Online (Sandbox Code Playgroud)

这是我得到的输出:

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"
Run Code Online (Sandbox Code Playgroud)

我也尝试过:

foreach ($i in $result) {
    $result[$i].ToString()
}
Run Code Online (Sandbox Code Playgroud)

Ans*_*ers 37

你正在使用Select-String,它产生MatchInfo对象.因为看起来你想要文件中的整个匹配行,你可能应该只返回对象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
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您还需要主机名,则可以使用计算属性添加它并返回自定义对象:

$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
    }
}
Run Code Online (Sandbox Code Playgroud)

只需回显数组变量即可输出数组:

PS C:\> $result
Server    Line
------    ----
...       ...

要获得自定义格式的输出,您可以使用格式operator(-f):

$result | ForEach-Object {
  '{0}: {1}' -f $_.Server, $_.Line
}
Run Code Online (Sandbox Code Playgroud)