2014-10-07 5 views
0

Я пытаюсь разработать простой скрипт, который копирует файлы на определенные диски.VBScript XCopy на локальный диск не работает

скрипт выполняет следующие действия:

  1. Проверки на физический диск с буквой
    • Если диск существует копирование файлов.
    • Если нет привода двигаться к шагу 2.
  2. Проверить сетевой диск с буквой
    • Если диск существует копирование файлов.
    • Если нет привода двигаться к шагу 3.
  3. Создать новое отображение сети
    • Копирование файлов на диск

Когда сетевой диск существует, или сеть отображается диск созданный с помощью скрипта, команды XCopy работают отлично. Проблема заключается в шаге 1, и локальный диск уже существует, никакие файлы не копируются на диск после вызова XCopy.

Вот мой код:

strLocalDrive = "E:" 
strRemoteShare = "\\127.0.0.1\c$\Program Files (x86)\MyFolder\EDrive" 
bolFoundExisting = False 
source = "C:\Program Files (x86)\MyFolder\EDrive\*" 
destination = "E:\" 

' Check parameters passed make sense 
If Right(strLocalDrive, 1) <> ":" OR Left(strRemoteShare, 2) <> "\\" Then 
'wscript.echo "Usage: cscript MapDrive.vbs drive fileshare //NoLogo" 
    WScript.Quit(1) 
End If 

'wscript.echo " - Mapping: " + strLocalDrive + " to " + strRemoteShare 

'Set objNetwork = WScript.CreateObject("WScript.Network") 
Set objNetwork = CreateObject("WScript.Network") 
Set oShell = CreateObject("WScript.Shell") 
Set objFSO = CreateObject("Scripting.FileSystemObject") 

' Loop through the network drive connections and disconnect any that match strLocalDrive 
Set objDrives = objNetwork.EnumNetworkDrives 

' first check that physical drive does not exist 
If objFSO.DriveExists(strLocalDrive) Then 
    WScript.echo "Physical Drive Found" 
    bolFoundExisting = True 
ElseIf objDrives.Count > 0 Then 
    For i = 0 To objDrives.Count-1 Step 2 
    If objDrives.Item(i) = strLocalDrive Then 
     strShareConnected = objDrives.Item(i+1) 
     'objNetwork.RemoveNetworkDrive strLocalDrive, True, True 
     i=objDrives.Count-1 
     bolFoundExisting = True 
    End If 
    Next 
End If 



If bolFoundExisting <> True Then 
    WScript.echo "Drive DOES NOT exists" 
    Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv") 
    objReg.GetStringValue HKCU, "Network\" & Left(strLocalDrive, 1), "RemotePath", strShareConnected 
    If strShareConnected <> "" Then 
    Set objReg = Nothing 
    bolFoundRemembered = True 
    End If 

    'Now actually do the drive map (not persistent) 
    Err.Clear 
    On Error Resume Next 
    objNetwork.MapNetworkDrive strLocalDrive, strRemoteShare, False 

Else 
    ' Drive exists copy files 
    WScript.echo "Drive exists" 
    oShell.Run "xcopy.exe " & source & " " & destination & " /C /D /E /H /I /K /R /S /Y" 
    Set oShell = Nothing 
End IF 

Я был бы очень признателен, если кто-нибудь может объяснить, почему команду XCOPY копирует только файлы на сетевые диски, а не на локальные диски! ТИА!

UPDATE Я понял, что проблема вызвана пробелами в имени пути. Странно, что копирование на сетевые диски работает, но не на физические диски. Как я могу обрабатывать пробелы в имени пути?

+0

Какова точная команда, которую вы бежите в вашем 'oShell. Выполнить? Он работает из командной строки? – Bond

+0

Поместите путь с пробелами в кавычки? – eurotrash

+0

@eurotrash Я не могу поместить их в кавычки, поскольку я определяю их в переменной вроде этого: source = "C: \ Program Files (x86) \ MyFolder \ EDrive \ *", а затем использовать ее так: oShell.Run "xcopy. exe "& source &" "& destination &"/C/D/E/H/I/K/R/S/Y " –

ответ

1

Ваши пути имеют пробелы в них, которые не будут хорошо расширяться для запуска команды xcopy. Во многом так же, как вам нужно использовать кавычки в командной строке, вам нужно указать свои строки для .Run. Мой предпочтительный способ вставки двойных кавычек - использовать Chr(34). 34 является кодом ANSI для двойных котировок

Простым примером может быть chr(34) & "quotedstring" & chr(34). В вашем случае вы могли бы использовать что-то вроде этого:

oShell.Run "xcopy.exe " & chr(34) & source & chr(34) & " " & chr(34) & destination & chr(34) & " /C /D /E /H /I /K /R /S /Y" 

Для readabilty вы всегда можете использовать подчеркивание, чтобы разбить линии вверх

oShell.Run "xcopy.exe " & chr(34) & source & chr(34) & " " & _ 
    chr(34) & destination & chr(34) & _ 
    " /C /D /E /H /I /K /R /S /Y" 
+0

Спасибо за ответ и +1 за объяснение! –