好吧,脚本似乎有几个问题,我似乎无法弄清楚它们中的任何一个,同时对脚本的一些反馈也会有很大的影响。这仍然是我的第一个脚本,因此可能需要进行大量的小调整,所以请告诉我想到的任何建议。
问题:大多数问题都围绕着日志记录。
未检查日志文件,因此脚本不断反复将计算机添加到日志文件中。
日志文件不会更新生成的信息,如os,mac,ip等。
正在显示的问题:
在此对象上找不到属性“结果”。确保它 存在。在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"
答案 0 :(得分:1)
此次问题是您在Result
收集成员中没有$Computers
成员,只有Name
和MAC
。除非你稍后在你的代码中添加这样一个成员,我真的不想阅读它,因为它已经是大约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")