2

あるネットワークの場所 (テレビ番組のダウンロード フォルダー) から別のネットワークの場所 (私の pvr) にファイルをコピーする vbscript (cscript/vbs) を取得しようとしています。

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 .. などの前の改行 コマンド プロンプトでの折り返しの問題であるかのように処理しましたが、文字列を「1 文字ずつ」調べても問題は明らかになりませんでした。

結局、ワイドバイトを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 スクリプト全体の更新され、最適化されたペーストビンは次のとおりです: http://pastebin.com/s1XtzCGC

于 2012-10-24T09:19:43.997 に答える