在scriptblock中分配局部变量

时间:2018-05-03 19:03:53

标签: powershell

我正在尝试从脚本块中分配一个本地变量而没有运气。目标是记录每台机器的状态,以获取先前数据和更改后数据所采取的操作。我不知道如何从脚本块中分配局部变量。非常感谢任何帮助。

$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 :(得分:0)

我无法确切地说出你想要做什么,所以我猜它是“将变量传递给在远程机器上调用的scriptblock”。如果是这种情况,您可以向scriptblock添加参数或使用$using:限定符,如下所示:

$using:row.DNSChangeStatus = 'Change Needed'

请注意,您无法“返回”任何方式,因此您必须从Invoke-Command实际返回修改后的对象。

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

并添加

$row

作为scriptblock的最后一行。