1

最終更新日が 30 日を超えている特定のディレクトリのすべてのファイルをアーカイブできるスクリプトを作成しています。ファイルを新しいフォルダに移動し、後でこのフォルダを圧縮する必要があります。

さらに、これは少し重要ですが、アーカイブ プロセスでは、ファイルを月ごとにグループ化する必要があります。圧縮されたフォルダーの名前は、含まれているファイルの月と年を示している必要があります。

例: 2012_12.zip (2012 年 12 月のすべてのファイルを含む) ; 2013_01.zip (2013 年 1 月以降のすべてのファイルが含まれています)

これは私がこれまでに持っているものです:

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

おまけ機能として、ディレクトリを入力として与える代わりに、スクリプトが複数のディレクトリを含む csv ファイルから読み取ると非常に便利です。

私はその瞬間に少し迷っています。すべての返信に事前に感謝します!

4

1 に答える 1

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."
于 2013-02-22T16:34:47.680 に答える