Powershell v2 |脚本不会声明变量,需要帮助调试

时间:2012-11-04 03:45:46

标签: powershell

好吧,脚本似乎有几个问题,我似乎无法弄清楚它们中的任何一个,同时对脚本的一些反馈也会有很大的影响。这仍然是我的第一个脚本,因此可能需要进行大量的小调整,所以请告诉我想到的任何建议。

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

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

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

  3. 正在显示的问题:

      

    在此对象上找不到属性“结果”。确保它   存在。在W:\ Powershell Scripting \ Test Lab \ TestFunction.ps1:86   焦炭: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"
    

2 个答案:

答案 0 :(得分:1)

此次问题是您在Result收集成员中没有$Computers成员,只有NameMAC。除非你稍后在你的代码中添加这样一个成员,我真的不想阅读它,因为它已经是大约100行并且包含很多代码不是与实际问题陈述有关。

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

您是否尝试过在Powershell ISE上调试脚本?它是Powershell 2的内置调试器。看一下关于它的Technet article

答案 1 :(得分:1)

$ Computers collection ...

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

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

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

异常消息明确说明了这一点,其中:

  

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

要解决这个问题,我建议初始化Result的属性,最有可能是这样:

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