как получить значение переменной в команде выбора и перенаправить в файл в PowerShell - PullRequest
0 голосов
/ 13 июля 2020

Я немного новичок в PowerShell и столкнулся с одной проблемой, и описание выглядит следующим образом: у меня есть один файл, в котором есть имена серверов, которые я хочу проверить на соединение с номером порта, а также хочу перенаправить вывод в файл (i хотите добавить данные). Если соединение было успешным или неудачным, я хочу записать вывод в файл. Я использую приведенный ниже код для этого, и есть одна настраиваемая переменная, которую я также хочу записать в файл.


 $server = Get-Content ('C:\my\dir\srv.txt')

 Foreach ($s in $server)
 
 {  $result = (Test-NetConnection -Port 443 -ComputerName $s).TcpTestSucceeded

        If(!$Result){
                $Remark = "TCP connect to computer Successful"
                Test-NetConnection -Port 443 -ComputerName $s | select TcpTestSucceeded,ComputerName,RemoteAddress,$Remark| Out-File status.txt

            }

            Else{ $Remark= "WARNING: TCP connect to computer either failed or timeout"

                Test-NetConnection -Port 443 -ComputerName $s | select TcpTestSucceeded,ComputerName,RemoteAddress,$Remark | Out-File status.txt    

            }

       }

out файл status.txt должен быть таким. Я не против сохранить эту информацию в двух разных файлах, один для истины, а другой для ложного. TcpTestSucceeded

TcpTestSucceeded ComputerName RemoteAddress Remark 
---------------- ------------ ------------- ------------
            True VAFIC81-123   172.0.0.64  TCP connect to computer Successful
            False VAFIC81-678   172.0.0.64  WARNING: TCP connect to computer either failed or timeout

Ответы [ 2 ]

1 голос
/ 13 июля 2020

Не должно быть причин для выполнения Test-NetConnection несколько раз, как это. Одного раза на сервер должно быть достаточно.

$server = Get-Content 'C:\my\dir\srv.txt'

$tcpTest = foreach ($s in $server) {
    # maybe you would also not wish to see warnings.
    # in that case add '-WarningAction SilentlyContinue' aswell
    $result = Test-NetConnection -Port 443 -ComputerName $s -ErrorAction SilentlyContinue
    $remark = if ($result.TcpTestSucceeded -eq $true) {
                "TCP connect to computer Successful"
              }
              else {
                "WARNING: TCP connect to computer either failed or timeout"
              }
    # output as object with added property 'Remark' to be collected in variable '$tcpTest'
    $result | Select-Object TcpTestSucceeded,ComputerName,RemoteAddress,
                            @{Name = 'Remark'; Expression = {$remark}}
}

# output on screen
$tcpTest | Format-Table -AutoSize

# output to CSV file
$tcpTest | Export-Csv -Path 'C:\my\dir\status.csv' -UseCulture -NoTypeInformation
1 голос
/ 13 июля 2020

Используйте для этого вычисляемое свойство:

$server = Get-Content ('C:\my\dir\srv.txt')

 Foreach ($s in $server)
 
 {  $result = (Test-NetConnection -Port 443 -ComputerName $s).TcpTestSucceeded

        If(!$Result){
                $Remark = "TCP connect to computer Successful"
                Test-NetConnection -Port 443 -ComputerName $s | select TcpTestSucceeded,ComputerName,RemoteAddress,@{n="Remark";e={$Remark}} | Out-File status.txt

            }

            Else{ $Remark= "WARNING: TCP connect to computer either failed or timeout"

                Test-NetConnection -Port 443 -ComputerName $s | select TcpTestSucceeded,ComputerName,RemoteAddress,@{n="Remark";e={$Remark}} | Out-File status.txt    

            }

       }

Расчетное свойство создает настраиваемое свойство в Select-Object. Он использует хеш-таблицу, где n - заголовок, а e - выражение.

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