【问题标题】:WScript.Shell.run launching robocopy doesn't show destination parametersWScript.Shell.run 启动 robocopy 不显示目标参数
【发布时间】:2012-10-23 10:37:22
【问题描述】:

我正在尝试使用 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

但新命令窗口中的 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.

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

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

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

【问题讨论】:

    标签: vbscript robocopy wsh


    【解决方案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 文件系统!解决了。​​

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-25
      相关资源
      最近更新 更多