我正在尝试使用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:随意优化它!
答案 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