2013-03-05 203 views
0

我无法弄清楚我做错了什么。 我有一个批处理文件启动一个VBS脚本。 该脚本只是在一些文件中进行一些操作,如移动它们,创建,删除... 它工作正常。 执行bat启动vbs脚本,一切正常。 BAT文件只是使一个CSCRIPT file.vbsvbs调度路径未找到

的问题是,我已经安排这个bat文件。 当时间到了,它会被执行,但在vbs脚本中出现“路径未找到”的错误。

这不是一个计划任务的问题,因为我已经11个任务运行的批处理文件和他们smootly运行,并执行脚本(我把控制器就可以了)。 但是,vbs脚本始终返回相同的路径找不到错误。

同样,如果我手动执行该脚本,它运行没有问题。

任务计划与我使用手动执行该文件相同的帐户,所以它不是一个权限问题。我只需双击批处理并运行它,单击任务计划管理器上的执行就会失败。

系统为Windows Server 2008 R2的标准。 我已经尝试过重新启动,删除及创建一个新的任务....

感谢大家

[更新]

我贴在这里的部分代码

文件:d: \脚本\ conf.ini

[script1] 
    fileA=D:\Rep\exportA.csv 
    fileB=D:\Rep\exportB.csv 
    fileC=D:\Rep\exportC.csv 
    dirHistory=D:\Rep\history 

文件:d:\脚本\ merge.vbs

Dim iniObj 
Set iniObj=New ClsINI 
If iniObj.OpenINIFile("D:\scripts\conf.ini") = False Then 
    wLog("Impossible to read file ini") 
    Set iniObj = Nothing 
    Chiudi() 
End If 
Dim errIni,tmpVal 
Dim fileA,fileB,fileC,dirHistory 

errIni = iniObj.GetINIValue("script1", "fileA", fileA) 
tmpVal = iniObj.GetINIValue("script1", "fileB", fileB) 
errIni = errIni+tmpVal 
tmpVal = iniObj.GetINIValue("script1", "fileC", fileC) 
errIni = errIni+tmpVal 
tmpVal = iniObj.GetINIValue("script1", "dirHistory", dirHistory) 
errIni = errIni+tmpVal 

If errIni > 0 Then 
    wLog("Error loading file ini") 
    wLog(errIni) 
    iniObj.CloseINIFile() 
    Set iniObj = Nothing 
    Chiudi() 
End If 

wLog("File ini Caricato") 

Dim objFso,posizioneFile,Fase 
Dim arrElement,resArray,actionArray,cedoleArray,varArray ,i 
Dim conn,rs,strCon 
Dim maxPos,maxTemp 
Dim objExcel, objSheet,cella 

Set objFso = CreateObject("Scripting.FileSystemObject") 

if objFso.FileExists(fileA) then 
    objFso.DeleteFile(posizione) 
    wLog("File posizione moved") 
else 
    wLog("File posizione not found") 
end if 

在这条线上得到的 “路径找不到” 错误

Set posizioneFile = objFso.OpenTextFile(fileA, 8, True) 

If not objFso.FileExists(fileB) then 
    SendEmail("nego") 
    Fase=false 
Else 
    Set tFile = objFso.OpenTextFile(fileB, 1) 
    strFile=tFile.ReadAll 

    tFile.Close 
    posizioneFile.WriteLine strFile 
    objFso.MoveFile fileB, dirHistory&"\Negoz_"& CreaId(2) & ".csv" 
End If 
posizioneFile.Close 

文件:d:\脚本\ merge.bat

echo Start Merge %date% %time% >> Started.log 
cscript D:\scripts\merge.vbs 

很抱歉,如果我没有把它之前,但我认为这是一个Windows问题,因为我认为代码很好。

感谢

+0

当你遇到错误时'fileA'的值是多少?在引发错误的行之前添加一行'WScript.Echo fileA',并检查a)是否获得绝对路径和b)路径是否存在。如果你得到一个相对路径,检查工作目录('WScript.Echo objFso.GetAbsolutePathName(“。”)')如果路径存在于其中。 – 2013-03-06 22:57:29

+0

我已经尝试回显变量值,并显示正确的绝对路径,它存在。我试着调试所有我能做的,但一切似乎都很好。我甚至试过让另一批执行merge.bat。它的工作原理。但一旦计划它返回错误。我想在Python中重写所有内容,但不喜欢留下未解决的事情,并且有800行代码要转换... – Dario 2013-03-07 08:47:08

+0

通过插入一行'WScript.Echo objFso.FileExists(fileA)来仔细检查: WScript.Echo objFso.FolderExists(objFso.GetParentFolderName(fileA))'。再仔细检查一下'fileA'是否包含一个实际的文件名(即没有尾部''''')。 – 2013-03-07 12:12:06

回答

1

这听起来像的工作目录,虽然这是一个有点难以启齿,因为你选择了不显示批处理脚本的内容的问题。如果手动启动脚本(通过双击),工作目录是批处理脚本(也可能是VBScript)所在的目录。如果将批处理脚本作为计划任务运行,则工作目录为%SystemRoot%\system32,除非您明确设置了任务属性中的工作目录。

现在,如果你的批处理脚本是这样的:

cscript.exe your.vbs 

它会寻找your.vbs在工作目录,并不会找到它,如果工作目录是不包含your.vbs的目录。如果我的假设是两个脚本是在同一目录下是正确的,你既可以将工作目录设置在计划任务或(更好)的性质改变批处理脚本是这样的:

cscript.exe "%~dp0your.vbs" 

%0是调用批处理脚本本身的路径。 %~dp0%0扩展为父目录的绝对路径(包括尾部反斜杠)。

+0

嗨,谢谢你的回答。我没有显示批处理文件,因为它只是echo date >> activate.log和cscript file.vbs。我已经在任务计划中设置了工作目录,错误不在批处理中,而是在vbs中。批处理正常启动,它执行vbs,但它是vbs中找不到的路径 – Dario 2013-03-05 14:48:49

+0

请使用(VBScript)代码更新您的问题。我们不是在这里玩猜谜游戏。 – 2013-03-05 17:24:30