WScript.Shell.run启动robocopy不显示目标参数

时间:2012-10-23 10:37:23

标签: vbscript robocopy wsh

我正在尝试使用vbscript(cscript / vbs)将文件从一个网络位置(我的电视节目下载文件夹)复制到另一个网络位置(我的pvr)。

我试图使用xcopy但最终出现“解析错误”而没有任何上下文。尝试了一些事情,比如确保引用了空格的文件,等等都无法解决。

我尝试使用scripting.filesystemobject的copyfile方法,但是由于“错误的文件名或编号”错误而失败并且在Google上搜索这个导致了许多死角。

我目前正在尝试使用robocopy处理副本,因为它通常比上述两者都好。但是当使用WScript.Shell的Run方法在cscript中运行时,目标,文件名和参数都会“脱落”。

所以这里是复制部分的剪辑。

        if dirmatch > "" then
            fileFrom = quote(myloc) ' & fil.name) 'fil.name will not need to be quoted
            fileTo = quote(dirmatch) ' puts double-quotes around things if they have spaces in the name
            ' copyCommand = "%comspec% /k xcopy " & fileFrom & " " & fileTo & " /C /D /Y" ' returns "parse error"
            copyCommand = "%comspec% /k robocopy " & fileFrom & " " & fileTo & " " & fil.name & " /R:3 /W:10"' /MOV"
            logmsg copyCommand
            oShellApp.run copyCommand
        else
            logmsg "no matching directory found for: " & fil.name
        end if

fileFrom和fileTo是我之前使用文件名解析计算的目录 - 只是格式为\\server\path\more path might have spaces\etc\etc。 fil.name是文件,它永远不会有空格 - 是点分隔的。文件夹名称中的空格是我使用的另一个应用程序中匹配原因的要求。

因此给定的文件复制命令应该如下所示:

00:19: %comspec% /k robocopy \\qnap\qdownload\transmission\completed \\pvr\e\tv\MythBusters Mythbusters.S11E03.Hail.Hijinx.HDTV.x264-FQM.mp4 /R:3 /W:10

但新命令窗口中的robocopy(例如cmd.exe /k)会像这样抛出:

-------------------------------------------------------------------------------
   ROBOCOPY     ::     Robust File Copy for Windows
-------------------------------------------------------------------------------
Started : Tue Oct 23 21:04:58 2012
Source : \\qnap\qdownload\transmission\completed\
Dest -
Files : *.*
Options : *.* /COPY:DAT /R:1000000 /W:30
------------------------------------------------------------------------------
ERROR : No Destination Directory Specified.

我正确地启动它,但它看不到第一个参数。使用副本执行相同的命令可能遇到了同样的问题。

如何让所有robocopy参数传递到新的cmd实例?

P.S。我的整个脚本在这里:http://pastebin.com/xgpGJYmU:随意优化它!

1 个答案:

答案 0 :(得分:1)

好的,所以经过多年的磕磕绊绊之后我终于得知目的地开头的一个字符的ascii代码小于零。 filesystemobject和asp都很有趣,让你有这样的愚蠢场景。 asp unicode实现:你这个混蛋!

从一开始就在那里凝视着我:

00:19: %comspec% /k robocopy \\qnap\qdownload\transmission\completed 
\\pvr\e\tv\MythBusters Mythbusters.S11E03.Hail.Hijinx.HDTV.x264-FQM.mp4 /R:3 /W:10

在\ pvr \ e之前的换行符等等我把它当作命令提示符中的包装问题对待它,但是没有一点“逐个字符”探索字符串就会发现问题。

最后,我无法删除可以将我的宽字节转换回ascii的正则表达式,因此必须逐字逐句地进行:

Function unicodeToAscii(sText)
  Dim x, aAscii, ascval, l
  l = len(sText)
  If l = 0 Then Exit Function
  redim aAscii(l)
  For x = 1 To l
    ascval = AscW(Mid(sText, x, 1))
    If (ascval < 0) Then
      ascval = 65536 + ascval ' http://support.microsoft.com/kb/272138
    End If
    aAscii(x) = chr(ascval)
  Next
  unicodeToAscii = join(aAscii,"")
End Function

这是一个非常糟糕的黑客。

任何问题,问题不是robocopy或wsh,而是使用unicode文件系统!解决。

P.S。这是整个脚本的更新,优化的pastebin:http://pastebin.com/s1XtzCGC