2013-04-19 1 views
1

아래의 스크립트를 사용하여 모든 특정 파일을 대상 폴더로 이동합니다. 중복되지 않고 대상 폴더에 파일을 복사하고 싶습니다.중복되지 않고 jpg 파일 만 폴더와 하위 폴더에서 다른 폴더로 이동

VBS를 10 분마다 실행하도록 예약 했으므로 이미 폴더에있는 동일한 파일을 다시 복사해서는 안됩니다.

Set fso = CreateObject("Scripting.FileSystemObject") 

testfolder = "D:\env" 
'fso.CreateFolder(testfolder) 

MoveFiles fso.GetFolder("D:\Movie Keys\License\2013_Apr_19") 

Sub MoveFiles(fldr) 
    For Each f In fldr.Files 
     basename = fso.GetBaseName(f) 
     extension = fso.GetExtensionName(f) 

     If LCase(extension) = "env" Then 
      dest = fso.BuildPath(testfolder, f.Name) 
      count = 0 
      Do While fso.FileExists(dest) 
       count = count + 1 
       dest = fso.BuildPath(testfolder, basename & "_" & count & "." _ 
         & extension) 
      Loop 
      f.Move dest 
     End If 
    Next 

    For Each sf In fldr.SubFolders 
     MoveFiles sf 
    Next 
End Sub 
+1

이 대상 폴더와 동일한 폴더 구조를 유지하는 것, 또는 하나의 대상 폴더에 모든 소스 폴더/하위 폴더를 복사 할 수 있습니까? – Dave

+1

그리고 모든 파일을 동일한 대상 폴더로 이동해야한다면 기존 파일을 보존하거나 덮어 써야합니까? –

+0

대상 폴더가 동일하게 유지되고 대상 폴더에 파일 형식 *. * env 만 복사하려고합니다. 그러나 원본 폴더에는 스크립트가 모든 *. * env 파일과 프로세스를 찾아야하므로 많은 하위 폴더가 포함됩니다. 그리고 이미 파일이 대상에 존재한다면 기존 파일을 복사해서는 안됩니다. 기존 파일 만 복사해야하며 기존 파일은 변경된 내용과 동일하게 유지해야합니다. – kumar

답변

2

여기서 문제는 모든 하위 파일의 소스 파일을 1 개의 대상 폴더에 복사하려는 것입니다. 이 시점에서 파일은 동일한 파일 이름을 가질 확률이 있으며 복사하는 동안 파일을 덮어 쓸 수 있습니다. 그렇지 않으면 파일이 건너 뛸 수 있습니다.

는 다음과 같은 코드 문제는, 당신은 어떤 소스 파일에 해당하는 파일 모르는 것입니다

 count = 0 
     Do While fso.FileExists(dest) 
      count = count + 1 
      dest = fso.BuildPath(testfolder, basename & "_" & count & "." & extension) 
     Loop 

이것을 달성하기 위해 노력하고 있습니다.

전체 경로로 파일 이름을 바꾸는 것이 좋습니다. 그래서, 소스 폴더의 모습을 가정 해 봅시다 :

enter image description here

는 FolderExample 및 sub01 모두에서 image01.jpg라는 파일이 있습니다.

여기서는 밑줄을 사용하여 각 폴더를 구분했습니다 (현실감이있을 수도 있고 그렇지 않을 수도 있음). 그러나이 새로운 파일 이름을 작성하면 같은 이름의 다른 파일을 덮어 쓸 수 없다는 것을 의미합니다! 파일을 다시 사용해야 할 경우

enter image description here

이제 문제는 파일 이름이 변경됩니다. 여기서 밑줄을 사용하는 것은 파일을 복사하고 밑줄로 분리 한 다음 전체 경로를 만들고 파일 이름을 가져 와서 파일을 복사하도록 다른 응용 프로그램을 프로그래밍 할 수 있다는 것입니다.

이것은 단순히 robocopy을 사용하여 중복을 만들지 않고 이미 대상에 존재하는 파일을 복사하지 않고 폴더를 동기화 할 경우

If LCase(extension) = "env" Then 
     dest = fso.BuildPath(testfolder, f.Name) 
     if not (fso.FileExists(dest)) then 
      f.Move dest 
     end if 
    End If 
+0

기존 파일을 복사하고 싶지 않고 실제로 귀하의 의견을 보내 주셔서 감사합니다. scrypt를 실행할 때 이미 복사 된 파일을 복사해서는 안되며 원본 폴더에 새로 추가 된 파일 만 복사해야합니다. – kumar

+0

그런 다음 fso.FileExists (dest) THEN dest = fso.BuidPath testFolder, basename ......) END IF * – Dave

+0

내 포인트를 명확하게하기 위해 코드에 추가 @AnsgarWiechers – Dave

1

If LCase(extension) = "env" Then 
     dest = fso.BuildPath(testfolder, f.Name) 
     count = 0 
     Do While fso.FileExists(dest) 
      count = count + 1 
      dest = fso.BuildPath(testfolder, basename & "_" & count & "." _ 
        & extension) 
     Loop 
     f.Move dest 
    End If 

를 대체 할 수있는, 의미

또는 스크립트

@echo off 

set dst=D:\env 
set src=D:\Movie Keys\License\2013_Apr_19 

robocopy "%src%" "%dst%" *.env 

편집 : 대상 폴더에 소스 트리를 탈수 할 때문에robocopy 귀하의 경우에 작동하지 않습니다.기존 코드는 당신이 원하는에 가까운,하지만 당신은 기존 파일을 덮어도 "버전"사본을 만들지 않으하지 않기 때문에이 변경해야이에

count = 0 
Do While fso.FileExists(dest) 
    count = count + 1 
    dest = fso.BuildPath(testfolder, basename & "_" & count & "." _ 
      & extension) 
Loop 
f.Move dest 

을 :

Set testfolder = CreateObject("Scripting.Dictionary") 
testfolder.CompareMode = vbTextCompare 'case-insensitive 
testfolder.Add "env", "D:\env" 
testfolder.Add "key", "D:\key" 
:
If Not fso.FileExists(dest) Then f.Move dest 

확장에 따라 다양한 대상 폴더를 사용하는 경우에는 대상 경로를 저장하는 dictonary을 사용할 수 있습니다

변경과 같은 코드 :

If testfolder.Exists(extension) Then 
    dest = fso.BuildPath(testfolder(extension), f.Name) 
    If Not fso.FileExists(dest) Then f.Move dest 
End If 
+0

두 파일의 이름이 같은 경우 어떻게됩니까? – Dave

+0

어떤 추가 스위치가 사용되는지에 따라 다릅니다. 기본적으로'robocopy'는 같은 이름의 소스 파일이 더 새로운 수정 날짜를 가진 경우 대상 파일을 업데이트합니다. 이것은'/ xn' 스위치를 사용하여 억제 할 수 있습니다 (더 새로운 것을 제외하십시오). –

+0

나는 이것이 (나에게 당신에게 +1을 주었음에도) 도움이 될 것이라고 생각하지 않는다! 나는 여러 번 OP를 다시 읽어야했다. 그는 여러 소스 폴더의 내용을 하나의 대상 폴더에 복사하려고합니다! 즉, 동일한 이름을 가진 파일이 대상 폴더로 보내질 확률이 높습니다. 즉, 덮어 쓰거나 복사하지 않을 가능성이 있습니다. 내 새 대답이이 폴더로 확장됩니다. – Dave

관련 문제