3

好吧,脚本似乎有几个问题,我似乎无法弄清楚其中的任何一个,对脚本的一些反馈也会非常感激。这仍然是我的第一个脚本,所以它可能需要很多小调整,所以请告诉我任何想到的建议。

问题:大多数问题都围绕日志记录。

  1. 未检查日志文件,因此脚本不断将计算机添加到日志文件中。

  2. 日志文件不会更新生成的信息,例如 os、mac、ip 等。

显示的问题:

在此对象上找不到属性“结果”。确保它存在。在 W:\Powershell Scripting\Test Lab\TestFunction.ps1:86 char:17 + IF ($Computer.<<<< Result -ne "Successful") { + CategoryInfo : InvalidOperation: (.:OperatorToken) [], RuntimeException +fullyQualifiedErrorId:PropertyNotFoundStrict

剧本

Set-PSDebug -strict
Set-StrictMode -Version latest
$consoleObject = (Get-Host).UI.RawUI

# Adjustable Variables
$Computers_Path = ".\computers.txt"
$Log_Path = ".\Log.txt"
$Log_MaxTick = 5
$RunOnServers = 0

# Multi-Threading Variables
$Jobs_MaxAtOnce = 20
$SleepTimer = 500

# Script Specific Variables
$ScriptTitle = "Local Admin Check"

# Validate Adjustable Variables
$Computers = @(Import-CSV $Computers_Path -header "Name","MAC")

# Framework Specific Variables (Pre-Setting Variables)
$Run = 0; $Succssful = 0; $Jobs_Count = 0; $Log_Tick= 0; $WriteToLog = "No"

# Misc
$Total = $Computers.length
IF (!(Test-Path $Log_Path)) { Add-Content $Log_Path "Name,OS,Mac,IPAddress,Status,Attempts,Result,LastAttempt" }
$Log = @(Import-Csv $Log_Path)
$Successful = ($Log | Where-Object {$_.Result -eq "Successful"} | Select-String -inputobject {$_.Name} -pattern $Computers | Measure-Object).Count

# Load Functions
Function GetOS {
    $RegCon = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $Computer.Name )
    $RegKey = $RegCon.OpenSubKey("SOFTWARE\Microsoft\Windows NT\CurrentVersion\")
    $RegValue = $RegKey.GetValue("ProductName")
    $RegCon.Close()
    $Computer.OS = $RegValue
}

Function SmartLogging {

    If ($Args[0] -eq "AddComputer") {
        Add-Content ($Computer.Name + "," + $Computer.OS + "," + $Computer.Mac + "," + $Computer.IPAddress + "," + $Computer.Status + "," + $Computer.Attempts + "," + $Computer.Result + "," + $Computer.LastAttempt) -path .\log.txt
    } ELSEIF ( $Log_Tick -eq $Log_MaxTick -OR $Args -eq "Update" ) {
        $Log_Tick = 0;
        Get-Content $Log_Path | Foreach-Object {$_ -replace "$Computer.Name,.*", ($Computer.Name + "," + $Computer.OS + "," + $Computer.Mac + "," + $Computer.IPAddress + "," + $Computer.Status + "," + $Computer.Attempts + "," + $Computer.Result + "," + $Computer.LastAttempt)} | Set-Content $Log_Path
    } ELSEIF ($Args[0] -eq "CheckComputer") {
         IF (!($Log | Select-String -pattern $Computer.Name -SimpleMatch)) {
            $Log += New-Object PSObject -Property @{ Name = $Computer.Name; OS = $NULL; Mac = $Computer.MAC; IPAddress = $NULL; Status = $NULL; Attempts = 0; Result = $NULL; LastAttempt = $NULL;}
            $Computer = $Log | Where-Object {$_.Name -eq $Computer.Name}
            SmartLogging AddComputer
        } ELSE {
            $Computer = $Log | Where-Object {$_.Name -eq $Computer.Name}
        }
    } ELSEIF (-not $Args[0]) {
        "Log Ticked"
        $Log_Tick++
    }
}

Function GetIPAddress {
    $IPAddress = [System.Net.Dns]::GetHostAddresses("TrinityTechCorp") | Where-Object {$_.IPAddressToString -like "*.*.*.*"};
    $Computer.IPAddress = $IPAddress.IPAddressToString
}

Function WindowTitle {
    [int]$Successful_Percent = $Successful / $Total * 100
    $consoleObject.WindowTitle = “$ScriptTitle - $Successful Out Of $Total ($Successful_Percent%) Successful `| Run`: $Run”
}

# Start Script
while ( $Successful -le $Total ) {
    $Run++
    ForEach ($Computer in $Computers) {
        WindowTitle 
        SmartLogging CheckComputer
        IF ($Computer.Result -ne "Successful") {
            IF (test-connection $Computer.Name -quiet ) {
                $Computer.Status = "Awake"
                IF (!$Computer.OS){GetOS}
                IF (!$Computer.IPAddress){GetIPAddress}
                ## Start Script ##
                    $CheckComputer = [ADSI]("WinNT://" + $Computer.Name + ",computer")
                    $Group = $CheckComputer.psbase.children.find("Administrators")
                    $members= $Group.psbase.invoke("Members") | %{$_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)}
                    ForEach($user in $members) {
                        $Result = $Computer.Name + "," + $user.ToString()
                        Add-Content $Result -path .\Result.csv
                    }
                ## End Script ##
                SmartLogging Update
                $Computer.Result = "Successful"
                $Successful += 1
            } ELSE {
                $Computer.Status = "Unknown"
            }
            $Computer.Attempts = [int] $Computer.Attempts + 1
            $Computer.LastAttempt = Get-Date -uFormat "%I:%M:%S%p %d%b%y"
        }
    SmartLogging
    }
}
Write-Output "Script Completed"
4

2 回答 2

1

这次的问题是您Result$Computers集合成员中没有成员,只有Nameand MAC。除非您稍后在代码中添加这样的成员,否则我真的不想阅读,因为它已经有大约 100 行并且包含许多与实际问题陈述无关代码。

$Computers = @(Import-CSV $Computers_Path -header "Name","MAC")

您是否尝试过在 Powershell ISE 上调试脚本?它是 Powershell 2 的内置调试器。请查看有关它的Technet 文章

于 2012-11-04T14:13:12.107 回答
1

$Computers 集合的这个声明......

$Computers = @(Import-CSV $Computers_Path -header "Name","MAC")

...不适用于这种情况:

IF ($Computer.Result -ne "Successful")

异常消息明确说明了这一点,以及在哪里:

在此对象上找不到属性“结果”。确保它存在。\TestFunction.ps1:86 字符:17

为了解决这个问题,我建议初始化 Result 的属性,很可能是这样的:

$Computers = @(Import-CSV $Computers_Path -header "Name","MAC","Result")
于 2012-11-12T16:49:08.013 回答