2013-02-21 1 views
1

최종 수정 날짜가 30 일 이상인 특정 디렉토리의 모든 파일을 보관할 수있는 스크립트를 만들고 있습니다. 파일을 새 폴더로 이동해야하며이 폴더는 나중에 압축해야합니다.보관 파일에 일괄

Aditionaly - 이것은 약간 crutial입니다. 보관 프로세스에서 파일은 월별로 그룹화되어야합니다. 압축 된 폴더의 이름은 포함 된 파일의 월 및 연도를 나타내야합니다.

예 : 2012_12.zip가 (2012 12 월부터 모든 파일을 포함);

보너스 기능으로
ECHO OFF 

ECHO. 
SET /p folder=Which folder you want to archive? 
ECHO. 
ECHO %folder% 

CHDIR %folder% 
MKDIR Archive 

ROBOCOPY "%folder%" "%folder%\Arquivo" /E /V /ETA /MOVE /XD "%folder%\Archive" 
:: Exclude files newer than 30 days 

FORFILES /P "%folder%\Archive" /D -31/12/2012 /D +1/12/2012 /C GOTO :ZIP 




CALL:ZIP 
SET filetozip="%folder%\Archive" 
set tempdir=C:\Users\tiago.campos\Documents\OMS\FilesArchiver\tempdir 
mkdir %tempdir% 
copy %filetozip% %tempdir% 
mkdir "%filetozip%\Archive" 
rmdir %tempdir% 
realdate 

echo Set objArgs = WScript.Arguments > _zipIt.vbs 
echo InputFolder = objArgs(0) >> _zipIt.vbs 
echo ZipFile = objArgs(1) >> _zipIt.vbs 
echo CreateObject("Scripting.FileSystemObject").CreateTextFile(ZipFile, True).Write "PK" ^& Chr(5) ^& Chr(6) ^& String(18, vbNullChar) >> _zipIt.vbs 
echo Set objShell = CreateObject("Shell.Application") >> _zipIt.vbs 
echo Set source = objShell.NameSpace(InputFolder).Items >> _zipIt.vbs 
echo objShell.NameSpace(ZipFile).CopyHere(source) >> _zipIt.vbs 
echo wScript.Sleep 2000 >> _zipIt.vbs 


CScript _zipIt.vbs %tempdir% "%filetozip%\Archive\2013.01.zip" 

del "_zipIt.vbs" 

pause 

, 그것은 매우 유용 할 경우 대신 디렉토리 등을 제공하는 것입니다 : 2013_01.zip 이것은 내가 지금까지 무엇을 가지고

(헤세이 2013 년 모든 파일을 포함) 스크립트는 하나 이상의 디렉토리가있는 csv 파일에서 읽습니다.

저는 잠시 잊었습니다. 모든 답장에 대해 미리 감사드립니다!

답변

0

이미 vbscript를 압축 용으로 사용하고 있으며 vbscript는 날짜가있는 산술 연산을 수행하는 데 더 좋기 때문에 vbscript에서 전체 작업을 수행 할 수도 있습니다.

나는 csv 일을하지 않았지만, 어쩌면 당신은 for %%I in (csvfile) do cscript /nologo archive.vbs %%I 또는 그 비슷한 배치로 스크립트를 호출 할 수 있습니다. 인수가 전달되지 않으면 현재 작업 디렉토리를 아카이브합니다.

' archive.vbs 
' usage: cscript archive.vbs (directory, optional) 

if not wscript.arguments.count then 
    dir = left(WScript.ScriptFullName,(Len(WScript.ScriptFullName))-(len(WScript.ScriptName))) 
else 
    dir = wscript.arguments(0) 
    if not Right(dir, 1) = "\" then 
     dir = dir & "\" 
    end if 
end if 

set fso = createobject("scripting.filesystemobject") 
set shl = createobject("shell.application") 
set osh = createobject("wscript.shell") 
set files = fso.getFolder(dir).files 
dim zips 
dim folders 
redim zips(-1) 
redim folders(-1) 

for each file in files 
    if DateDiff("d", file.datelastmodified, Date()) > 30 then 
     yyyymm = DatePart("yyyy", file.datelastmodified) & "_" & Right("0" & DatePart("m", file.datelastmodified), 2) 
     dest = dir & yyyymm & "\" 
     if not fso.folderexists(dest) then 
      fso.createFolder dest 
      zip = dir & yyyymm & ".zip" 
      redim preserve zips(ubound(zips) + 1) 
      redim preserve folders(ubound(folders) + 1) 
      zips(ubound(zips)) = zip 
      folders(ubound(folders)) = dest 
     end if 
     Wscript.echo "Moving " & file & " to " & dest 
     fso.moveFile file, dest 
    end if 
next 

set files = nothing 

Wscript.echo "Copying finished." 

on error resume next 
for i = lbound(zips) to ubound(zips) 
    Wscript.echo i & ": Zipping " & folders(i) & " to " & zips(i) 
    set zip = fso.createtextfile(zips(i)) 
    zip.write "PK" & chr(5) & chr(6) & string(18, chr(0)) 
    zip.close 
    set zip = Nothing 
    shl.namespace(zips(i)).copyhere shl.namespace(folders(i)).items 
    do until shl.namespace(zips(i)).items.count = shl.namespace(folders(i)).items.count 
     wscript.sleep 100 
    loop 

    ' This method of deleting folders is more reliable than fso.deletefolder 
    ' for paths with long filenames. 
    osh.run "cmd /c rmdir /q /s """ & folders(i) & """", 1, true 
next 

Wscript.Echo "Done."