Ошибка VBScript - требуется объект ObjTSO - PullRequest
0 голосов
/ 01 июля 2018
'========================================================================
'## Global Object and Variable Settings
'======================================================================== 

Dim WshShell: Set WshShell = CreateObject("WScript.Shell")
Dim objFSO: Set objFSO = CreateObject("Scripting.FileSystemObject")
Dim strSystemDrive: strSystemDrive = WshShell.ExpandEnvironmentStrings("%SystemDrive%")

'========================================================================
'## Main Code 
'========================================================================

 'On Error Resume Next

'---------------------------------------------------------------------------------------------------------------------------
'## Script Variables 
'---------------------------------------------------------------------------------------------------------------------------
Dim strFolder: strFolder = strSystemDrive & "\Endpoint Reboot Info"
Dim strFile: strFile = strSystemDrive & "\Endpoint Reboot Info\Endpoint_Reboot_Logfile.txt" 
strcurrentDateTime = Now()
 Dim string0: string0 = "Endpoint restart analysis initialized"
Dim string1: string1 = "Calculating the endpoint uptime .. If greater than 14 days, machine will be restarted"
Dim string2: string2 = "Warning: The current OS Uptime exceeds 14 days! This system will be rebooted!"
 Dim string3: string3 = " As the current OS Uptime is less than 14 days, this system will NOT be rebooted currently"
Dim string4: string4 = "This system will restart now!"
Dim string5: string5 = "User has clicked cancel, hence PC was NOT restarted"
Dim string6: string6 = "User has clicked OK. Restarting PC now.."

'---------------------------------------------------------------------------------------------------------------------------
'## Code for creating the folder and file necessary for logging and initializing the log file
'---------------------------------------------------------------------------------------------------------------------------  
Function CreateLogFile(filename)
Dim f: set f = objFSO.OpenTextFile(strFile, 8, True)
f.WriteLine strcurrentDateTime & " " & string0  
f.WriteLine strcurrentDateTime & " " & string1
Set CreateLogFile = f
End Function

'---------------------------------------------------------------------------------------------------------------------------
'## Code for checking endpoint OS uptime and force restarting post message display to end user
'---------------------------------------------------------------------------------------------------------------------------
Dim objTSO: Set objTSO = CreateLogFile(strFile) 
 strComputer = "." 
Const FOR_APPENDING = 8

SET objWMIDateTime = CREATEOBJECT("WbemScripting.SWbemDateTime")
SET objWMI = GETOBJECT("winmgmts:\\" & strComputer & "\root\cimv2")
SET colOS = objWMI.InstancesOf("Win32_OperatingSystem")
FOR EACH objOS in colOS
objWMIDateTime.Value = objOS.LastBootUpTime 
objTSO.WriteLine "Last Boot Up Time: " & objWMIDateTime.GetVarDate & vbcrlf & _
    "System Up Time: " &  TimeSpan(objWMIDateTime.GetVarDate,NOW) & _
    " (hh:mm:ss)"
NEXT

FUNCTION TimeSpan(dt1, dt2) 
' Function to display the difference between
' 2 dates in hh:mm:ss format
IF (ISDATE(dt1) AND ISDATE(dt2)) = FALSE THEN 
    TimeSpan = "00:00:00" 
    EXIT FUNCTION 
    END IF 

    seconds = ABS(DATEDIFF("S", dt1, dt2)) 
    minutes = seconds \ 60 
    hours = minutes \ 60 
    minutes = minutes MOD 60 
    seconds = seconds MOD 60 

    IF LEN(hours) = 1 THEN hours = "0" & hours 

    TimeSpan = hours & ":" & _ 
        RIGHT("00" & minutes, 2) & ":" & _ 
        RIGHT("00" & seconds, 2) 


If (hours > 336) Then
    f.WriteLine strcurrentDateTime & " " & string2
    Dim retval: retval = InputBox("Warning!: The current OS Uptime exceeds 14 days! This system will be rebooted! Please save ALL of your work and ONLY then click OK")
    If IsEmpty(retval) Then
            msgbox ("User has terminated the action by clicking cancel")
        objTSO.WriteLine string5                
    Else 
        objTSO.WriteLine string6            
        WshShell.Run "shutdown.exe -R -T 0"             
    End If  

Else
    WScript.Sleep 10000 
    strcurrentDateTime = Now()  
    objTSO.WriteLine strcurrentDateTime & string3       
    WScript.Quit
End If
f.Close()
END FUNCTION 
'---------------------------------------------------------------------------------------------------------------------------
'## End of code/VB Script
'---------------------------------------------------------------------------------------------------------------------------  

Я поставил полный сценарий, как было предложено. Пожалуйста, помогите с вопросами ниже:

  1. Эта строка не записывается в файл журнала

    objTSO.WriteLine "Last Boot Up Time: " & objWMIDateTime.GetVarDate & vbcrlf & _
        "System Up Time: " &  TimeSpan(objWMIDateTime.GetVarDate,NOW) & _
        " (hh:mm:ss)"
    
  2. Также, пожалуйста, проверьте логику кода, изменив условие (часы> 336). Этот сценарий будет выполняться локально на компьютерах, поэтому вместо предыдущей функции перезагрузки я изменил его на WshShell.Run "shutdown.exe -R -T 0"

Пожалуйста, руководство! Спасибо !!

1 Ответ

0 голосов
/ 01 июля 2018

Ваша функция CreateLogFile создает / открывает файл, но сразу же закрывает его:

Function CreateLogFile()
    If objFSO.FileExists(strFile) Then
        Set objTSO = objFSO.OpenTextFile(strFile, FOR_APPENDING)
        objTSO.WriteLine strcurrentDateTime & " " & string0
        objTSO.WriteLine strcurrentDateTime & " " & string1
        <b>objTSO.Close()</b>
    Else
        objFSO.CreateTextFile(strFile)
        Set objTSO = objFSO.OpenTextFile(strFile, FOR_APPENDING)
        objTSO.WriteLine strcurrentDateTime & " " & string0
        objTSO.WriteLine strcurrentDateTime & " " & string1
        <b>objTSO.Close()</b>
    End If
End Function

означает, что когда функция возвращает дескриптор файла, он уже закрыт, что приводит к неудаче всех последующих попыток записи в файл (без повторного открытия).

Что вы действительно хотите сделать, так это изменить свою функцию на что-то вроде этого:

Function CreateLogFile(filename)
    Dim f : Set f = objFSO.OpenTextFile(filename, 8, True)
    f.WriteLine Now & " " & string0
    f.WriteLine Now & " " & string1
    Set CreateLogFile = f
End Function

Dim objTSO : Set objTSO = CreateLogFile(strFile)

...

objTSO.Close   'at the end of the script

Установка третьего параметра метода OpenTextFile на True заставляет его создать файл в случае его отсутствия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...