Назначьте локальную переменную в блоке скрипта - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь назначить локальную переменную из блока скриптов, но безуспешно. Цель состоит в том, чтобы записать состояние каждой машины для действия, выполненного с данными до и данными после изменения. Я не уверен, как назначить локальную переменную из блока скрипта. Любая помощь очень ценится.

$csvContents = @() # Create the empty array that will eventually be the CSV file
$Computers = Get-ADComputer -Filter '(OperatingSystem -like "Windows Server*") -and (Name -like "AD*")' | Sort-Object Name
foreach ($Computer in $Computers) {
    $row = New-Object PSObject # Create an object to append to the array
    $row | Add-Member -MemberType NoteProperty -Name "ComputerName" -Value NotSet
    $row | Add-Member -MemberType NoteProperty -Name "PingStatus" -Value NotSet
    $row | Add-Member -MemberType NoteProperty -Name "DNSChangeStatus" -Value NotSet
    $row | Add-Member -MemberType NoteProperty -Name "BeforeChange" -Value NotSet
    $row | Add-Member -MemberType NoteProperty -Name "AfterChange" -Value NotSet
    #Write-Host "$($Computer.Name): " -ForegroundColor Yellow
    $row.ComputerName = $Computer.Name
    $rtn = Test-Connection -CN $Computer.dnshostname -Count 1 -BufferSize 16 -Quiet
    if ($rtn -match 'True') {
        Write-Host -ForegroundColor Green $Computer.DnsHostname
        $row.PingStatus = 'Pingable'
        Invoke-Command -ComputerName $Computer.Name -ScriptBlock {
            $NewDnsServerSearchOrder = "10.93.108.225","10.93.108.134"
            $Adapters = Get-WmiObject Win32_NetworkAdapterConfiguration | Where-Object {$_.DHCPEnabled -ne 'True' -and $_.DNSServerSearchOrder -eq "10.93.108.226"}
            if ($Adapters -ne $null) {
                # Show DNS servers before update
                Write-Host "Before: " -ForegroundColor Green
                $row.DNSChangeStatus = 'Change Needed'
                $Adapters | ForEach-Object {
                    $_.DNSServerSearchOrder
                    $row.BeforeChange = $_.DNSServerSearchOrder
                }
                # Update DNS servers
                $Adapters | ForEach-Object {$_.SetDNSServerSearchOrder($NewDnsServerSearchOrder)} | Out-Null
                # Show DNS servers after update
                $Adapters = Get-WmiObject Win32_NetworkAdapterConfiguration | Where-Object {$_.DHCPEnabled -ne 'True' -and $_.DNSServerSearchOrder -ne $null}
                Write-Host "After: " -ForegroundColor Green
                $Adapters | ForEach-Object {
                    $_.DNSServerSearchOrder
                    $row.AfterChange = $_.DNSServerSearchOrder
                }
            } else {
                Write-Host "No DNS change needed " -ForegroundColor Yellow
                $row.DNSChangeStatus = 'No DNS Change Needed'
            }
        }
    } else {
        Write-Host -ForegroundColor Red $Computer.DnsGostname
        Write-Host -ForegroundColor Red "Host not pingable"
        $row.PingStatus = 'Not Pingable'
    }
    $csvContents += $row # append the new data to the array
    $row = $null
}
$csvContents | Export-Csv -Path C:\DNSChanges.csv

1 Ответ

0 голосов
/ 03 мая 2018

Я не могу точно сказать, что вы хотите сделать, поэтому я предполагаю, что это «передать переменную в скрипт-блок, вызываемый на удаленной машине». В этом случае вы можете либо добавить параметры в блок скриптов, либо использовать квалификатор $using:, как в:

$using:row.DNSChangeStatus = 'Change Needed'

Обратите внимание, что вы не можете "вернуть" что-либо таким образом, поэтому вам действительно нужно вернуть измененный объект из Invoke-Command.

$row = Invoke-Command -ComputerName $Computer.Name -ScriptBlock {

и добавьте

$row

как последняя строка скриптового блока.

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