在Vbs脚本中使用Xcopy但跳过复制的文件

时间:2014-05-01 17:03:52

标签: vbscript

Set oShell = CreateObject("WScript.Shell")
strCommand = oShell.Run("Xcopy ""p:\"" ""d:\12"" /S /Y", 0, True)
If strCommand <> 0 Then
MsgBox "Error: Not_Copy" & strCommand
Else
MsgBox "Copy_Done"

End If

我使用上面的vb脚本将我的所有数据从笔式驱动器复制到“d:\ 12”文件夹。我有一个问题。

很多时候,我在pendrive中有相同的文件夹和相同的文件夹路径,例如“p:\”中的“java-setup.exe”以及“d:\ 12”。 当我播放这个VBScript文件时,它会替换所有文件,浪费了大量时间。

是否有任何选项可以让它停止替换文件(跳过已经复制的文件),并只关注那些未复制的文件?

我是脚本,初学者级别的新手。所以请直接编码,不是这样,

$srcdir = "\\server\source\";
$destdir = "C:\destination\";
$files = (Get-ChildItem $SrcDir -recurse -filter *.* | where-object {-not ($_.PSIsContainer)});
$files|foreach($_){
if (!([system.io.file]::Exists($destdir+$_.name))){
            cp $_.Fullname ($destdir+$_.name)
};

很多时候我无法理解它。

我的笔驱动器路径是“p:\”,我必须复制的文件是“d:\ 12”

请提供脚本。

2 个答案:

答案 0 :(得分:1)

我找不到能够满足你需要的XCOPY开关。不过,这个VBScript应该可以工作。

With CreateObject("Scripting.FileSystemObject")
    For Each File In .GetFolder("P:\").Files
        If Not .FileExists("D:\12\" & File.Name) Then
            .CopyFile File.Path, "D:\12\" & File.Name
        End If
    Next
End With

答案 1 :(得分:1)

是的,xcopy并不像其他人所说的那样支持。但是有批处理命令可以。

将其放入(“CopyWithoutReplace.bat”)

For %%F In ("P:\*.*") Do If Not Exist "D:\12\%%~nxF" Copy "%%F" "D:\12\%%~nxF"

您修改后的脚本:

Set oShell = CreateObject("WScript.Shell")
strCommand = oShell.Run("P:\CopyWithoutReplace.bat", 0, True)
If strCommand <> 0 Then
MsgBox "Error: Not_Copy" & strCommand
Else
MsgBox "Copy_Done"
End If

您也可以使用Robocopy

  

Robocopy或“Robust File Copy”是命令行目录复制命令。它作为Windows资源工具包的一部分提供,从Windows NT 4.0开始,作为Windows Vista,Windows 7和Windows Server 2008的标准功能引入。

Or you could use Powershell

$srcdir = "\\server\source\";
$destdir = "C:\destination\";
$files = (Get-ChildItem $SrcDir -recurse -filter *.* | where-object {-not ($_.PSIsContainer)});
$files|foreach($_){
if (!([system.io.file]::Exists($destdir+$_.name))){
            cp $_.Fullname ($destdir+$_.name)
};

最后:Here is an entire SO Thread on copying without replacing.