i have a script that runs for days. It connects to a machine on the network (uses a txt file for recordset), pings and connects to machine, then shuts down 2 services, then moves a file, then restarts the services (then moves to next record). I have put the script together with the invaluable support of other tek-tips members. At the present, however, i am unsure if it is working. if anyone can help (corrections, improvements, anything), i'd appreciate it.
here is my code:
On Error Resume Next
'Wscript.Echo "Beginning Script "
' define ADSI status constants
Const ADS_SERVICE_STOPPED = 1
Const ADS_SERVICE_START_PENDING = 2
Const ADS_SERVICE_STOP_PENDING = 3
Const ADS_SERVICE_RUNNING = 4
Const ADS_SERVICE_CONTINUE_PENDING = 5
Const ADS_SERVICE_PAUSE_PENDING = 6
Const ADS_SERVICE_PAUSED = 7
Const ADS_SERVICE_ERROR = 8
' define string constants for service methods
Const START_SERVICE = "START"
Const STOP_SERVICE = "STOP"
Const PAUSE_SERVICE = "PAUSE"
Const CONTINUE_SERVICE = "CONTINUE"
' declare global variables
Dim objWsh
Dim objEnv
Dim strComputerName
'open the file system object
Set oFSO = CreateObject("Scripting.FileSystemObject")
set WSHShell = wscript.createObject("wscript.shell")
'open the data file
Set oTextStream = oFSO.OpenTextFile("wslist.txt")
'make an array from the data file
RemotePC = Split(oTextStream.ReadAll, vbNewLine)
'close the data file
oTextStream.Close
Set objEnv = WSHShell.Environment("PROCESS")
myFile="file.file"
sourceDir="\\server\folder\"
destDir="\program files\folder\"
Set WSHNetwork = CreateObject("WScript.Network")
WSHNetwork.MapNetworkDrive "U:", sourceDir,"True"
For Each strWorkstation In RemotePC
'Do something useful with strWorkstation
strComputerName = strWorkstation
set objShell = CreateObject("WScript.Shell")
' Wscript.Echo "Pinging " & strComputerName
response = ping(strComputerName)
intSuccess = instr(response," Received = 0")
if intSuccess = 0 then
'Wscript.Echo "Connected " & strComputerName
blnSeverUp = true
else
blnServerUp = false
'Wscript.Echo "Not Connected " & strComputerName
end if
If blnServerUp = false Then
destDir2 = "\\" & strComputerName & "\C$" & destDir
'Wscript.Echo destDir2
WSHNetwork.MapNetworkDrive "Y:", destDir2
' Wscript.Echo "Mapped"
' call CycleService() to stop all the services
CycleService strComputerName,"FSMA",STOP_SERVICE,False
CycleService strComputerName,"FSPM",STOP_SERVICE,False
Call WSHShell.Run("cmd.exe /C xcopy U:\" & myFile & " Y:\")
' wscript.Echo "cmd.exe /C xcopy U:\" & myFile & destDir2
'Wscript.Echo "Copied"
' call CycleService() to start all the services
CycleService strComputerName,"FSPM",START_SERVICE,False
CycleService strComputerName,"FSMA",START_SERVICE,False
'Else
' WScript.Echo strComputerName & " did not respond to ping."
End If
' Wscript.Echo strComputerName & " Completed"
If err.number <> 0 Then
wscript.Echo "Error!!! " & err.Description
End If
Next
Set oFSO = Nothing
Set WSHShell = Nothing
Set WSHNetwork = Nothing
Wscript.Echo "All done"
WScript.Quit(0)
' ****************************************
' CycleService() subroutine
' this subroutine is passed four variables:
' 1. strComputer = the name of the computer
' 2. strService = the name of the service (e.g. w3svc, smtpsvc, etc.)
' 3. strOperation = the operation to be completed (e.g. start, stop)
' 4. boolTrace = True will output trace information, False will not
' ****************************************
Sub CycleService(strComputer,strService,strOperation,boolTrace)
On Error Resume Next
' declare variables
Dim objComputer
Dim objService
Dim strTrace
Dim boolSuccess
' get ADSI objects and initial variables
Set objComputer = GetObject("WinNT://" & strComputer & ",computer")
Set objService = objComputer.GetObject("Service",strService)
strTrace = strOperation & " " & strService & " on " & strComputer
boolSuccess = False
' output trace information if needed
If boolTrace Then Trace "Attempting to " & strTrace & "..."
' determine the operation and carry it out
Select Case (strOperation)
Case START_SERVICE
If (objService.Status = ADS_SERVICE_STOPPED) Then
objService.Start
' If Err.Number<>0 Then ErrorHandler strTrace
While objService.Status <> ADS_SERVICE_RUNNING: Wend
boolSuccess = True
End If
Case STOP_SERVICE
If (objService.Status = ADS_SERVICE_RUNNING) Or (objService.Status = ADS_SERVICE_PAUSED) Then
objService.Stop
' If Err.Number<>0 Then ErrorHandler strTrace
While objService.Status <> ADS_SERVICE_STOPPED: Wend
boolSuccess = True
End If
Case PAUSE_SERVICE
If (objService.Status = ADS_SERVICE_RUNNING) Then
objService.Pause
' If Err.Number<>0 Then ErrorHandler strTrace
While objService.Status <> ADS_SERVICE_PAUSED: Wend
boolSuccess = True
End If
Case CONTINUE_SERVICE
If (objService.Status = ADS_SERVICE_PAUSED) Then
objService.Continue
' If Err.Number<>0 Then ErrorHandler strTrace
While objService.Status <> ADS_SERVICE_RUNNING: Wend
boolSuccess = True
End If
End Select
' output trace information if needed
If boolTrace And boolSuccess Then Trace strTrace & " was successful."
End Sub
' ****************************************
' Trace() subroutine
' outputs time and trace information
' ****************************************
Sub Trace(strText)
WScript.Echo Now & " : " & strText
End Sub
' ****************************************
' ErrorHandler() subroutine
' outputs error status and exits
' ****************************************
Sub ErrorHandler(strText)
'Dim strError
'strError = Now & " : The following error occurred trying to " & strText & vbCrLf
'strError = strError & vbCrLf & "0x" & Hex(Err.Number)& " - " & Err.Description
'WScript.Echo strError
'WScript.Quit
Err.Clear
End Sub
function ping(strTarget)
cmdline="%COMSPEC% /c ping " & response
Call ExternalCMDCall(cmdline,strOut)
ping=strOut
end function
Sub ExternalCMDCall(cmdline,strOut)
set objExCmd = objShell.Exec(cmdline)
strOut=objExCmd.StdOut.ReadAll
End Sub
here is my code:
On Error Resume Next
'Wscript.Echo "Beginning Script "
' define ADSI status constants
Const ADS_SERVICE_STOPPED = 1
Const ADS_SERVICE_START_PENDING = 2
Const ADS_SERVICE_STOP_PENDING = 3
Const ADS_SERVICE_RUNNING = 4
Const ADS_SERVICE_CONTINUE_PENDING = 5
Const ADS_SERVICE_PAUSE_PENDING = 6
Const ADS_SERVICE_PAUSED = 7
Const ADS_SERVICE_ERROR = 8
' define string constants for service methods
Const START_SERVICE = "START"
Const STOP_SERVICE = "STOP"
Const PAUSE_SERVICE = "PAUSE"
Const CONTINUE_SERVICE = "CONTINUE"
' declare global variables
Dim objWsh
Dim objEnv
Dim strComputerName
'open the file system object
Set oFSO = CreateObject("Scripting.FileSystemObject")
set WSHShell = wscript.createObject("wscript.shell")
'open the data file
Set oTextStream = oFSO.OpenTextFile("wslist.txt")
'make an array from the data file
RemotePC = Split(oTextStream.ReadAll, vbNewLine)
'close the data file
oTextStream.Close
Set objEnv = WSHShell.Environment("PROCESS")
myFile="file.file"
sourceDir="\\server\folder\"
destDir="\program files\folder\"
Set WSHNetwork = CreateObject("WScript.Network")
WSHNetwork.MapNetworkDrive "U:", sourceDir,"True"
For Each strWorkstation In RemotePC
'Do something useful with strWorkstation
strComputerName = strWorkstation
set objShell = CreateObject("WScript.Shell")
' Wscript.Echo "Pinging " & strComputerName
response = ping(strComputerName)
intSuccess = instr(response," Received = 0")
if intSuccess = 0 then
'Wscript.Echo "Connected " & strComputerName
blnSeverUp = true
else
blnServerUp = false
'Wscript.Echo "Not Connected " & strComputerName
end if
If blnServerUp = false Then
destDir2 = "\\" & strComputerName & "\C$" & destDir
'Wscript.Echo destDir2
WSHNetwork.MapNetworkDrive "Y:", destDir2
' Wscript.Echo "Mapped"
' call CycleService() to stop all the services
CycleService strComputerName,"FSMA",STOP_SERVICE,False
CycleService strComputerName,"FSPM",STOP_SERVICE,False
Call WSHShell.Run("cmd.exe /C xcopy U:\" & myFile & " Y:\")
' wscript.Echo "cmd.exe /C xcopy U:\" & myFile & destDir2
'Wscript.Echo "Copied"
' call CycleService() to start all the services
CycleService strComputerName,"FSPM",START_SERVICE,False
CycleService strComputerName,"FSMA",START_SERVICE,False
'Else
' WScript.Echo strComputerName & " did not respond to ping."
End If
' Wscript.Echo strComputerName & " Completed"
If err.number <> 0 Then
wscript.Echo "Error!!! " & err.Description
End If
Next
Set oFSO = Nothing
Set WSHShell = Nothing
Set WSHNetwork = Nothing
Wscript.Echo "All done"
WScript.Quit(0)
' ****************************************
' CycleService() subroutine
' this subroutine is passed four variables:
' 1. strComputer = the name of the computer
' 2. strService = the name of the service (e.g. w3svc, smtpsvc, etc.)
' 3. strOperation = the operation to be completed (e.g. start, stop)
' 4. boolTrace = True will output trace information, False will not
' ****************************************
Sub CycleService(strComputer,strService,strOperation,boolTrace)
On Error Resume Next
' declare variables
Dim objComputer
Dim objService
Dim strTrace
Dim boolSuccess
' get ADSI objects and initial variables
Set objComputer = GetObject("WinNT://" & strComputer & ",computer")
Set objService = objComputer.GetObject("Service",strService)
strTrace = strOperation & " " & strService & " on " & strComputer
boolSuccess = False
' output trace information if needed
If boolTrace Then Trace "Attempting to " & strTrace & "..."
' determine the operation and carry it out
Select Case (strOperation)
Case START_SERVICE
If (objService.Status = ADS_SERVICE_STOPPED) Then
objService.Start
' If Err.Number<>0 Then ErrorHandler strTrace
While objService.Status <> ADS_SERVICE_RUNNING: Wend
boolSuccess = True
End If
Case STOP_SERVICE
If (objService.Status = ADS_SERVICE_RUNNING) Or (objService.Status = ADS_SERVICE_PAUSED) Then
objService.Stop
' If Err.Number<>0 Then ErrorHandler strTrace
While objService.Status <> ADS_SERVICE_STOPPED: Wend
boolSuccess = True
End If
Case PAUSE_SERVICE
If (objService.Status = ADS_SERVICE_RUNNING) Then
objService.Pause
' If Err.Number<>0 Then ErrorHandler strTrace
While objService.Status <> ADS_SERVICE_PAUSED: Wend
boolSuccess = True
End If
Case CONTINUE_SERVICE
If (objService.Status = ADS_SERVICE_PAUSED) Then
objService.Continue
' If Err.Number<>0 Then ErrorHandler strTrace
While objService.Status <> ADS_SERVICE_RUNNING: Wend
boolSuccess = True
End If
End Select
' output trace information if needed
If boolTrace And boolSuccess Then Trace strTrace & " was successful."
End Sub
' ****************************************
' Trace() subroutine
' outputs time and trace information
' ****************************************
Sub Trace(strText)
WScript.Echo Now & " : " & strText
End Sub
' ****************************************
' ErrorHandler() subroutine
' outputs error status and exits
' ****************************************
Sub ErrorHandler(strText)
'Dim strError
'strError = Now & " : The following error occurred trying to " & strText & vbCrLf
'strError = strError & vbCrLf & "0x" & Hex(Err.Number)& " - " & Err.Description
'WScript.Echo strError
'WScript.Quit
Err.Clear
End Sub
function ping(strTarget)
cmdline="%COMSPEC% /c ping " & response
Call ExternalCMDCall(cmdline,strOut)
ping=strOut
end function
Sub ExternalCMDCall(cmdline,strOut)
set objExCmd = objShell.Exec(cmdline)
strOut=objExCmd.StdOut.ReadAll
End Sub