【问题标题】:VBScript: way to check why the script stopped?VBScript:检查脚本为什么停止的方法?
【发布时间】:2010-03-26 03:55:42
【问题描述】:

我有这个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

【问题讨论】:

  • 这看起来不像完整的脚本。 OutputToLog 函数在哪里?
  • 脚本是如何被调用的?您是直接从命令控制台运行它(通过 cscript?wscript?)还是有一个 .bat 文件“包装器”?
  • 我正在使用 cscript 运行它。我故意省略了 outputtolog 函数以节省格式化空间。
  • 我们怎么知道那里没有导致问题的原因?
  • 那么在它暂停之前有输出吗?

标签: vbscript


【解决方案1】:

我能够多次运行您的脚本而无需暂停输入。运行带有//X 标志的脚本以在调试器中启动它:

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

您应该能够单步执行代码。

您也可以开始在任何地方添加wscript.echo 跟踪语句,看看是否可以缩小等待的范围。

过去让我感动的一件事;如果您的命令控制台处于快速编辑模式,并且您不小心单击了控制台窗口中的任意位置,则控制台将在等待您按键时挂起。

【讨论】:

  • 对于用于启动命令控制台的快捷方式,单击标题栏中的图标并选择属性。在选项选项卡上,确保未选中快速编辑模式。单击确定并选择修改快捷方式。再次启动它,QuickEdit 将关闭。
【解决方案2】:

第一步是删除所有全局 On Error Resume Next 语句。如果我们能看到脚本,会有更好的反馈。

【讨论】:

  • 将脚本副本添加到原始问题中
  • 我注释掉了'on error resume next,它仍然随机停止,直到我按空格键继续
【解决方案3】:

当文本文件已经有来自其他进程的打开句柄时,或者因为您之前在代码中打开了一个尚未关闭的句柄,您通常会在尝试写入文本文件时收到 Permission denied。我没有尝试过,但我不知道为什么这不起作用,您可以查看使用来自 Sysinternals (Microsoft) 的 Handle 来告诉您哪个进程具有该文件的打开句柄。请参阅此处以获取有关如何使用 Handle 的进一步参考:http://www.orcsweb.com/blog/post/Closing-open-file-handles.aspx 您还可以编写第二个脚本,该脚本在循环中运行以监视主脚本。第二个脚本可以通过执行 WMI 进程查询来验证第一个脚本,该查询仅返回与定义的命令行匹配的进程。然后第二个脚本可以重新启动它停止的主脚本,提醒您,记录文件,启动句柄搜索等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-09
    • 2012-08-25
    • 1970-01-01
    • 2020-05-31
    • 2023-04-01
    • 2017-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多