Tek-Tips is the largest IT community on the Internet today!

Members share and learn making Tek-Tips Forums the best source of peer-reviewed technical information on the Internet!

  • Congratulations SkipVought on being selected by the Tek-Tips community for having the most helpful posts in the forums last week. Way to Go!

script takes forever to run 2

Status
Not open for further replies.

holidayIT

IS-IT--Management
Apr 2, 2004
138
0
0
US
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


 
you mean, just enter the xcopy command by hand into command prompt? it once told me unc was not supported, but now it tells me file not found for the file i using. but i double checked, and the file is there, so i am guessing that it goes back to unc not being supported.
 
let me correct that. it wouldn't work for the folder the file was in, i just did an xcopy with the file in the root of the fileserver, and it worked! let me try the script w/o mapped drives.
 
XCOPY supports the UNC naming, provided the shared resource is available.

Hope This Helps, PH.
Want to get great answers to your Tek-Tips questions? Have a look at FAQ219-2884 or FAQ222-2244
 
holidayIT,

It should be supported, even with internal "copy"!!! I don't know. What's your os? It is becoming more and more like a permissible and security problem.

- tsuji
 
sorry, i posted wheil you guys were posting. i am trying it without the mapped drives, and it's giving me a command prompt with "invalid number of parameters" i am trying to see if my xcopy has an extra space in it somewhere, but i do not see it. the code i am now using is this:

Call WSHShell.Run("cmd.exe /k xcopy " & sourceDir & myFile & " " & destDir2 & " /y /k")

i am also going to try just writing it all out explicitly.
 
I GOT IT!!!!!!!!! and of course, it was because i am an idiot. the destination folder was program files. but xcopy needs it to be program_files because its command prompt. i will more than likely feel pretty dumb as soon as the high of success and completion wears off! Thanks to everyone for all there help. thanks phv, thanks tsuji!

stars for everyone!
 
Congrats!
It's the 'little' things, that drive us crazy sometimes...

BTW: You can also fix it by surrounding the sourceDir, File and DestDir strings with quotes:

Code:
Call WSHShell.Run("cmd.exe /k xcopy " & chr(34) & sourceDir  & chr(34)  & chr(34) &  myFile & " "  & chr(34)  & chr(34) & destDir2  & chr(34) &  " /y /k")

This should allow you to use paths containing spaces...

Best wishes,
Andy
 
i never thought of that. thanks. now i just have to clean it up and debug some other issues (but i know what those are). thanks
 
i have a new issue. when i run the xcopy command, it doesn't put the file in the program files folder, it makes a new folder called program_files

any ideas?
 
Status
Not open for further replies.

Part and Inventory Search

Sponsor

Back
Top