2

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

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

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

我目前正在尝试让 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

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

-------------------------------------------------------------------------------
   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.

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

如何获取所有 robocopy 参数以传递给新的 cmd 实例?

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

4

1 回答 1

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 .. etc 之前的换行符我将其视为命令提示符中的换行问题,但对字符串的“逐个字符”探索没有发现问题。

最后,我无法剪切一个可以将我的宽字节转换回 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 文件系统!解决了。

ps 这是整个脚本的更新、优化的 pastebin:http: //pastebin.com/s1XtzCGC

于 2012-10-24T09:19:43.997 回答