Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBScript:检查脚本停止原因的方法?_Vbscript - Fatal编程技术网

VBScript:检查脚本停止原因的方法?

VBScript:检查脚本停止原因的方法?,vbscript,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 =

我已经运行了这个程序,但是,当它正在处理时,它会随机停止,并要求用户点击空格键,让它显示其余正在进行的输出

我怎样才能知道为什么会发生这种情况

以下是脚本的副本:

'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,第一步是删除所有全局On Error Resume Next语句。如果我们能看到脚本,就会得到更好的反馈。

我可以多次运行您的脚本,而不会暂停输入。使用
//X
标志运行脚本以在调试器中启动它:

>cscript //nologo //X dpadmin_copy2.vbs"
然后,您应该能够逐步完成代码

您还可以开始将
wscript.echo
trace语句放在任何地方,看看是否可以缩小等待的范围


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

当文本文件已经有来自其他进程的打开句柄时,或者因为您之前在代码中打开了未关闭的句柄,尝试写入文本文件时,您通常会被拒绝权限。我还没有尝试过这个方法,但我不知道为什么它不起作用,您可以看看使用fromsysinternals(Microsoft)来告诉您哪个进程具有文件的开放句柄。有关如何使用Handle的更多参考信息,请参见此处:您还可以编写第二个脚本,在循环中运行,以监视主脚本。第二个脚本可以通过执行WMI进程查询来验证第一个脚本,该查询只返回与定义的命令行匹配的进程。然后,第二个脚本可以重新启动主脚本,它会停止、提醒您、记录文件、启动句柄搜索等。

在原始问题中添加了一份脚本副本。我注释掉了“下一步继续出错”,但它仍然会随机停止,直到我按空格键使其继续。这看起来不像完整的脚本。OutputToLog函数在哪里?如何调用脚本?您是直接从命令控制台(通过cscript?wscript?)运行它,还是有一个.bat文件“包装器”?我使用cscript运行它。为了节省格式化空间,我特意省略了outputtolog函数。我们如何确切地知道没有什么东西导致问题?在暂停之前是否有任何输出?对于用于启动命令控制台的快捷方式,请单击标题栏中的图标并选择“属性”。在“选项”选项卡上,确保未选中“快速编辑”模式。单击“确定”并选择修改快捷方式。再次启动它,QuickEdit将关闭。