Try downloading the .zip archive again, there has been a modification that fixes the missing file. I am attaching the script to this message.
I just ran it on my machine and it completed without errors. It has been tested on Office 2000 and XP. dave -----Original Message----- From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]] Sent: Friday, December 14, 2001 12:35 PM To: [EMAIL PROTECTED] Subject: Help with one of Dave Roth's examples I just picked up the book Win32 Perl Programming: Standard Extensions: Second Edition, by Dave Roth It is a superb book, and learning a lot about Perl-Win32. There was one script I was really interested in and unfortunately I could not download it for some reason, it was not included in the examples. So I just copied it myself from the book, took some time but it is worth it. The script goes out and grabs all the errors from the event viewers and puts the information into a Microsoft Excel spreadsheet. The script gets as far as opening Microsoft Excel, but then it closes and the error is below. When I first ran it I did have some syntax errors, but I fixed those right away. Now I am stumped I am getting the following error: "Can't Call method "Worksheets" on an undefined value at eventviewer.pl line 174" The exercise is 5.27 in the book, on pages 271-276. Here is the line it is referring to but you can see the whole script below in the sub SetupWorksheet: while( $Sheet->{Parent}->Worksheets( $Name ) ) If anyone can take a look at the script below and if you think you know what might be the error. I would greatly appreciate it. I am not sure if I copied the script worng, I double-checked everything, but since it is a long script I could have missed something easily, or there was a misprint in the book. Thanks: use Win32::OLE qw ( with ); use win32::OLE::Variant; use Win32::EventLog; use Win32::NetAdmin; use Win32::OLE::Const 'Microsoft Excel'; $Win32::EventLog::GetMessageText = 1; $DateFormat = "DDD mmm dd, yyyy - hh:mm:ss"; $Class = "Excel.Application"; $Domain = ""; @EVENT_SOURCES = ( "System", "Application"); $EVENT_TYPE = EVENTLOG_ERROR_TYPE | EVENTLOG_WARNING_TYPE; $Dir = "c:\\temp"; $FileName = "AdminReport.xls"; $File = "$Dir\\$FileName"; $SecPerDay = 24 * 60 * 60; $Now = time(); $TimeLimit = $Now - ( $SecPerDay * 1 ); $Excel = GetApplication( $Class) || Error( "Could not start $Class" ); $Book = GetWorkbook( $Excel ) || Error( "Could not obtain a workbook" ); $Sheet = GetWorksheet( $Book ) || Error( "Could not obtain a worksheet" ); print "Fetching list of servers...\n"; Win32::NetAdmin::GetServers( '' , $Domain, SV_TYPE_DOMAIN_CTRL | SV_TYPE_DOMAIN_BAKCTRL, \@Servers ); $Row = 3; foreach $Machine ( sort (@Servers) ) { print "Processing $Machine.\n"; $Sheet->Range( "A" . ++$Row )->{Value} = $Machine; $Sheet->Range( "A$Row" )->{Font}->{Bold}=1; map{ ProcessLog( $Machine, $_, $EVENT_TYPE ); } ( @EVENT_SOURCES ); $Row++; } ShutDownSheet( $Sheet ); sub ProcessLog { my ( $Machine, $Source, $Type )=@_; my $Flag, $Num, %Hash; my $Event = new Win32::EventLog( $Source, $Machine ) || sub { $Sheet->Range( "B" . ++$Row )->{Value} = "Unable to connect."; return; }; if( $Event->GetNumber( $Num) ) { my $iCount = 0; $Flag = EVENTLOG_BACKWARDS_READ | EVENTLOG_SEQUENTIAL_READ; do { if( $Event->Read( $Flag, $Num, \%Hash ) ) { print "\r $Source records processed: ", ++$iCount, " " x 10; if( $Hash{EventType} & $Type ) { my ( $EventType, $Color, $Time ); if( $Hash{EventType} == EVENTLOG_ERROR_TYPE ) { $EventType = "Error"; $Color = 3; } elsif( $Hash{EventType} == EVENTLOG_WARNING_TYPE ) { $EventType = "Warning"; $Color = 53; } elsif( $Hash{EventType} == EVENTLOG_INFORMATION_TYPE ) { $EventType = "Information"; $Color = 1; } $Row++; $Time = "" . localtime( $Hash{TimeGenerated} ); $Time = ~ s/^.*?\s+(.*?)\s+(.*?)\s+(.*?)\s+(.*)/$1 $2 $4 $3/; $sheet->Range( "B$Row:H$Row" )->{Value} = [ "$Source: $EventType", $Hash{Source}, ($Hash{Event}) ? $Hash{Event}:"None", ($Hash{User}) ? $Hash{User}:"N/A", $Hash{Computer}, new Win32::OLE::Variant( VT_DATE, $Time ), $Hash{Message} ]; $Sheet->Range( "B$Row" )->{Font}->{ColorIndex} = $Color; } } $num=0; } while( $TimeLimit < $Hash{TimeGenerated} ); print "\n"; Win32::EventLog::CloseEventLog( $Event->{handle} ); } } sub GetApplication { my( $Class ) = @_; my( $Application ); if( ! ( $Appplication = Win32::OLE->GetActiveObject( $Class ) ) ) { $Application = new Win32::OLE( $Class, "Quit" ) || die } $Application->{Visible} = 1; return( $Application ); } sub GetWorkbook { my( $Application ) = @_; my $Book; if( ! ( $Book = $Application->Workbooks( $FileName ) ) ) { if( ! ( $Book = $Application->Workbooks->Open( $File ) ) ) { my $Temp = $Application->{SheetsInNewWorkbook}; $Application->{SheetsInNewWorkbook}=1; $Book = $Application->Workbooks->Add(); $Book->SaveAs( $File ); $Application->{SheetsInNewWorkbook} = $Temp; $UseSheetNumber = 1; } } $Book->{Application}->Windows( $Book->{Name} )->{Visible} = 1; return( $Book ); } sub GetWorksheet { my( $Book ) = @_; my( $Sheet ); if ($UseSheetNumber ) { $Sheet = $Book->Worksheets( $UseSheetNumber ); } else { $Sheet = $Book->Worksheets()->Add(); } SetupWorksheet( $Sheet ); return ( $Sheet ); } sub SetupWorksheet { my( $Sheet ); my( $Range ); my( $Date, $Name, $iCount, @Date ); @Date = localtime(); @Date = sprintf( "%04d.%02d.%02d", $Date[5] + 1900, $Date[4] + 1, $Date[3] ); $Name = $Date; $iCount = 1; # The line below is the one giving me the error while( $Sheet->{Parent}->Worksheets( $Name ) ) { $Name = "$Date #" . ++$iCount; } $Sheet->{Name} = $Name; $Range = $Sheet->Range( "A1" ); $Range->{Value} = "Server Error Logs for the morning of $Date"; $Range->{Font}->{Size}=24; $Range->{Font}->{ColorIndex} = 6; $Sheet->Rows("1:1")->{Interior}->{ColorIndex} =5; $Range = $Sheet->Range("A3:H3"); $Range->{Value} = [ "Server", "Type", "Source", "Event", "User", "Computer", "Time", "Description" ]; with( $Range->{Font}, Bold => 1, Italic => 1, Size => 16 ); $Range->{HorizontalAlignment} => xlCenter; with( $Sheet->Columns( "G" ), NumberFormat => $DataFormat, HorizontalAlignment => xlCenter ); } sub ShutDownSheet { my( $Sheet ) =0_; $Sheet->Columns( "B:G" )->AutoFit(); $Sheet->Columns( "H:H" )->{ColumnWidth} = 72; $Sheet->Rows()->AutoFit(); $Sheet->{Parent}->Save(); $Sheet->{Parent}->Close(); } sub Error { my ( $Error ) = @_; print "$Error\n"; exit(); } _______________________________________________ Perl-Win32-Admin mailing list [EMAIL PROTECTED] http://listserv.ActiveState.com/mailman/listinfo/perl-win32-admin
Example05_27.pl
Description: Binary data
