VBScript: способ проверить, почему скрипт остановился? - PullRequest
0 голосов
/ 26 января 2009

У меня есть этот VBScript , который работает, однако, пока он обрабатывает, он будет случайным образом останавливаться и потребовать от пользователя нажатия пробела, чтобы он отобразил остальную часть своего текущего вывода.

Как мне выяснить, почему это происходит?

Вот копия скрипта:

'On Error Resume Next

Dim arrFolders()
intSize = 0

Function StampNow()
Dim Hr, Mn, Yr, Mon, Dy, Date1
Date1=Now()

Hr=DatePart("h",Date1)
Mn=DatePart("n",Date1)
Yr = DatePart("yyyy",Date1)
Mon = DatePart("m",Date1)
Dy = DatePart("d",Date1)

StampNow = Yr & "-" & Mon & "-" & Dy
end function

'Output log info.
Function OutputToLog (strToAdd)
    Dim strDirectory,strFile,strText, objFile,objFolder,objTextFile,objFSO
    strDirectory = "c:\log"
    strFile = "\dpadmin_copy2run-"& StampNow &  ".bat"
    'strText = "dpadmin_copy2"
    strText = strToAdd

    ' Create the File System Object.
    Set objFSO = CreateObject("Scripting.FileSystemObject")

    ' Check that the strDirectory folder exists.
    If objFSO.FolderExists(strDirectory) Then
       Set objFolder = objFSO.GetFolder(strDirectory)
    Else
       Set objFolder = objFSO.CreateFolder(strDirectory)
       'WScript.Echo "Just created " & strDirectory
    End If

    If objFSO.FileExists(strDirectory & strFile) Then
       Set objFolder = objFSO.GetFolder(strDirectory)
    Else
       Set objFile = objFSO.CreateTextFile(strDirectory & strFile)
       'Wscript.Echo "Just created " & strDirectory & strFile
    End If

    set objFile = nothing
    set objFolder = nothing
    ' OpenTextFile Method needs a Const value
    ' ForAppending = 8 ForReading = 1, ForWriting = 2
    Const ForAppending = 8

    Set objTextFile = objFSO.OpenTextFile _
    (strDirectory & strFile, ForAppending, True)

    ' Writes strText every time you run this VBScript.
    objTextFile.WriteLine(strText)
    objTextFile.Close
End Function

strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

strFolderName = "D:\1\production\Openjobs"

Set colSubfolders = objWMIService.ExecQuery _
    ("Associators of {Win32_Directory.Name='" & strFolderName & "'} " _
        & "Where AssocClass = Win32_Subdirectory " _
            & "ResultRole = PartComponent")

    dim diffindates

    'Init vars for regex.
    Dim retVal, retVal2
    Dim Lastprop
    Dim objRegExpr 'regex variable
    Set objRegExpr = New regexp
    Set objRegExprX31 = New regexp
    objRegExpr.Pattern = "[0-9][0-9][0-9][0-9][0-9][0-9][A-Z][A-Z][A-Z]"
    objRegExprX31.Pattern = "[0-9][0-9][0-9][0-9][0-9][0-9]X31"
    objRegExpr.Global = True
    objRegExprX31.Global = True
    objRegExpr.IgnoreCase = True
    objRegExprX31.IgnoreCase = True

    'Variables for getting last accessed property.
    Dim fs, f
    Set fs = CreateObject("Scripting.FileSystemObject")

    'Current time vars.
    Dim currenttime
    currenttime = Now()

    ParentFolder = "D:\1\Production\Openjobs\ClosedJobs"

For Each objFolder in colSubfolders
    intSize = intSize + 1

    retVal = objRegExpr.Test(objFolder.Name)
    retVal2 = objRegExprX31.Test(objFolder.Name)
    if (retVal OR retVal2 ) then
        'set filename to array
            strFolderName = objFolder.Name

        'Get last modified date.
        Set f = fs.GetFolder(objFolder.Name)
        Lastprop = f.DateLastModified
        'MsgBox(Lastprop)

        if ( DateDiff("m", f.DateLastModified, Now()) > 4) then
            diffindates =  DateDiff("m", f.DateLastModified, Now())
            Set objShell = CreateObject("Shell.Application")
            Set objCopyFolder = objShell.NameSpace(ParentFolder)

            OutputToLog("rem " & f.DateLastModified & ":" & objFolder.Name )

            outputtolog("move /Y """ & objFolder.Name & """ "  & ParentFolder)

            wscript.echo(diffindates & ":" & objFolder.Name & vbCr)
        end if
    end if
Next

Обновление

Останавливается на линии:

Set objTextFile = objFSO.OpenTextFile _
(strDirectory & strFile, ForAppending, True)

с ошибкой Ошибка выполнения Microsoft VBScript: разрешение отклонено

Я немного смущен этим. Лог-файл был только 356kb

Ответы [ 3 ]

1 голос
/ 27 января 2009

Мне удалось запустить ваш сценарий несколько раз без его остановки для ввода. Запустите ваш скрипт с флагом //X, чтобы запустить его в отладчике:

>cscript //nologo //X dpadmin_copy2.vbs"

После этого вы сможете пройти по коду.

Вы также можете начать вставлять wscript.echo операторы трассировки везде и посмотреть, сможете ли вы сузить область ожидания.

Одна вещь, которая получила меня в прошлом; Если ваша командная консоль находится в режиме QuickEdit, и вы случайно щелкаете в любом месте окна консоли, консоль зависнет, ожидая, пока вы нажмете клавишу.

0 голосов
/ 13 февраля 2009

Обычно вы получаете отказ в разрешении при попытке записи в текстовый файл, когда текстовый файл уже имеет открытый дескриптор какого-либо другого процесса или потому что вы ранее открывали дескриптор ранее в своем коде, который вы не закрыли. Я не пробовал это, но я не знаю, почему это не сработает, вы можете посмотреть, используя Handle от Sysinternals (Microsoft), чтобы сказать вам, какой процесс имеет дескриптор открытия для файла. Пожалуйста, смотрите здесь для получения дополнительной информации о том, как использовать Handle: http://www.orcsweb.com/blog/post/Closing-open-file-handles.aspx Вы также можете написать второй скрипт, который запускается в цикле для мониторинга основного скрипта. Второй сценарий может проверить первый сценарий, выполнив запрос процесса WMI, который возвращает только процессы, которые соответствуют определенной командной строке. Затем второй сценарий может перезапустить основной, который он останавливает, предупредить вас, записать файл, запустить поиск по дескриптору и т. Д.

0 голосов
/ 26 января 2009

Ну, первый шаг - удалить все глобальные операторы On Error Resume Next. Лучшая обратная связь получится, если мы увидим сценарий.

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