Export-CSV не записывает содержимое в файл при вводе информации из скрипта, выполняющего Invoke-Command для Test-NetConnection - PullRequest
0 голосов
/ 10 марта 2020

Прежде всего, спасибо за чтение. Я новичок в Powershell, поэтому, пожалуйста, прости мое невежество. Кроме того, я впервые пишу здесь.

До того, как у меня было это, и оно работало, однако, это было безумно медленно. Вот начальный скрипт:

$RemoteComputers = (Get-ADComputer -Filter {OperatingSystem -Like 'Windows*'} -Property * -SearchBase "OU=Computers,OU=Domain".Name 

ForEach ($Computer in $RemoteComputers)
{
$result = Invoke-Command -ErrorAction SilentlyContinue -ComputerName $Computer -ScriptBlock {Test-NetConnection -Port 135 server.domain.local}  
[pscustomobject]@{
                    Target = $Computer
                    RemoteAddress = $result.RemoteAddress
                    SourceAddress = (Resolve-Dnsname $Computer -ErrorAction SilentlyContinue).IPAddress
                    Port   = $result.RemotePort
                    Status = $result.tcpTestSucceeded
                }        
}

затем запустил его, выполнив это

.\ports.ps1 | Tee-Object -Variable result | Export-Csv ports-all.csv -NoTypeInformation

Итак, ниже я удалил -Property * и очистил его. Однако нет содержимого в файле CSV. Может кто-нибудь сказать мне, почему, когда я запускаю это, в csv-файле нет содержимого?

$RemoteComputers = (Get-ADComputer -Filter {OperatingSystem -Like 'Windows*'} -SearchBase "OU=Computers,OU=Domain").Name 

$results = try {
    Invoke-Command -ErrorAction Stop -ComputerName $RemoteComputers -ScriptBlock {
        $Test = Test-NetConnection -Port 135 "server.domain.local"
        [pscustomobject]@{
            Target = $Env:COMPUTERNAME
            RemoteAddress = $Test.RemoteAddress
            SourceAddress = (Resolve-Dnsname $Env:COMPUTERNAME -ErrorAction SilentlyContinue).IPAddress
            Port   = $Test.RemotePort
            Status = $Test.tcpTestSucceeded
        }    
    }
}
catch {
    Write-Output ([pscustomobject]@{
        Target = $_.TargetObject
        RemoteAddress = $null
        SourceAddress = $null
        Port   = $null
        Status = "Failed to connect"
    })
}

$results | select target, remoteaddress, sourceaddress, port, status | export-csv file.csv

Так что этот последний скрипт ничего не выводит в CSV. Почему?

1 Ответ

0 голосов
/ 10 марта 2020

Похоже, Resolve-DnsName вернет коллекцию адресов IPv6 и v4. Я полагаю, что это зависит от того, что находится в вашей зоне DNS. Я не знаю, насколько это надежно, но вы можете заключить команду в подвыражение массива, а затем сослаться на индекс [1]

SourceAddress = @((Resolve-Dnsname $Env:COMPUTERNAME -ErrorAction SilentlyContinue).IPAddress)[1]

Мои тесты не были реальными, но похоже, что вы, вероятно, хотите чтобы поставить пробную защелку внутри ScriptBlock Invoke-Command.

Может быть что-то вроде:

$RemoteComputers = (Get-ADComputer -Filter {OperatingSystem -Like 'Windows*'} -SearchBase "OU=Computers,OU=Domain").Name 

$results = 
    Invoke-Command -ErrorAction Stop -ComputerName $RemoteComputers -ScriptBlock {
        try {
        $Test = Test-NetConnection -Port 135 "server.local.com"
        [pscustomobject]@{
            Target = $Env:COMPUTERNAME
            RemoteAddress = $Test.RemoteAddress
            SourceAddress = @((Resolve-Dnsname $Env:COMPUTERNAME -ErrorAction SilentlyContinue).IPAddress)[1]
            Port   = $Test.RemotePort
            Status = $Test.tcpTestSucceeded
        } }
        catch {
        [pscustomobject]@{
            Target = $_.TargetObject
            RemoteAddress = $null
            SourceAddress = $null
            Port   = $null
            Status = "Failed to connect"
        } }
}

$results | select target, remoteaddress, sourceaddress, port, status | export-csv file.csv

Я бы также отметил, что Test-NetConnection, похоже, не хорошо работать с Try / Catch и с SilentlyContinue в качестве действия по ошибке. Я не уверен, насколько хорошо будет работать улов. есть, но попробуйте кое-что из этого и дайте мне знать, как это происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...