пакетный файл для удаления файлов, более старых, чем указанная дата [дубликат]

В Java все переменные, которые вы объявляете, на самом деле являются «ссылками» на объекты (или примитивы), а не самими объектами.

При попытке выполнить один метод объекта , ссылка просит живой объект выполнить этот метод. Но если ссылка ссылается на NULL (ничего, нуль, void, nada), то нет способа, которым метод будет выполнен. Тогда runtime сообщит вам об этом, выбросив исключение NullPointerException.

Ваша ссылка «указывает» на нуль, таким образом, «Null -> Pointer».

Объект живет в памяти виртуальной машины пространство и единственный способ доступа к нему - использовать ссылки this. Возьмем этот пример:

public class Some {
    private int id;
    public int getId(){
        return this.id;
    }
    public setId( int newId ) {
        this.id = newId;
    }
}

И в другом месте вашего кода:

Some reference = new Some();    // Point to a new object of type Some()
Some otherReference = null;     // Initiallly this points to NULL

reference.setId( 1 );           // Execute setId method, now private var id is 1

System.out.println( reference.getId() ); // Prints 1 to the console

otherReference = reference      // Now they both point to the only object.

reference = null;               // "reference" now point to null.

// But "otherReference" still point to the "real" object so this print 1 too...
System.out.println( otherReference.getId() );

// Guess what will happen
System.out.println( reference.getId() ); // :S Throws NullPointerException because "reference" is pointing to NULL remember...

Это важно знать - когда больше нет ссылок на объект (в пример выше, когда reference и otherReference оба указывают на null), тогда объект «недоступен». Мы не можем работать с ним, поэтому этот объект готов к сбору мусора, и в какой-то момент VM освободит память, используемую этим объектом, и выделит другую.

15
задан double-beep 2 February 2019 в 09:55
поделиться

7 ответов

Я использую этот сценарий:

////////////////////////////////////////////////////////
// Deletes file older than a number of days 
// in the current directory
////////////////////////////////////////////////////////
// Usage: wscript DeleteOlderThan.js [#Days]
// By default, remove files older than 30 days
////////////////////////////////////////////////////////

function removeDays(date, nDays)
{
    var dateRet = date
    return dateRet.setDate(date.getDate() - nDays);
}

function addSlash(strPath)
{
    var c = strPath.substr(-1, 1);
    if( c !== '\\' && c !== '/' )
    {
        strPath += '\\';
    }
    return strPath;
}

// Read arguments
var nDays = WScript.Arguments(0) || 30;

// Create system objects
var fs = WScript.CreateObject("Scripting.FileSystemObject");
var shell = WScript.CreateObject("WScript.Shell");

// Retrieve current directory
var strDirectoryPath = addSlash(shell.CurrentDirectory);

// Compute date
var dateNow = new Date();
var dateTest = removeDays(dateNow, nDays);

// Iterate on files
var folder = fs.GetFolder(strDirectoryPath);
var files = folder.Files;

for( var it = new Enumerator(files); !it.atEnd(); it.moveNext() )
{
    var file = it.item();

    if( file.DateLastModified < dateTest)
    {
        file.Delete(true);
    }
}

, с которым я вызываю каждый день:

wscript "C:\Program Files\Utils\DeletesOlderThan.js" 30
10
ответ дан 1 December 2019 в 01:46
поделиться

Редактирование: я понял это.

Для удаления всех файлов, более старых, чем данная дата:

REM del_old.bat
REM usage: del_old MM-DD-YYY
for /f "tokens=*" %%a IN ('xcopy *.* /d:%1 /L /I null') do if exist %%~nxa echo %%~nxa >> FILES_TO_KEEP.TXT
for /f "tokens=*" %%a IN ('xcopy *.* /L /I /EXCLUDE:FILES_TO_KEEP.TXT null') do if exist "%%~nxa" del "%%~nxa"

Для удаления всех файлов, более новых, чем данная дата:

REM del_new.bat
REM usage: del_new MM-DD-YYYY
for /f "tokens=*" %%a IN ('xcopy *.* /d:%1 /L /I null') do if exist "%%~nxa" del "%%~nxa"
6
ответ дан 1 December 2019 в 01:46
поделиться

Мое решение работает, если Вы

  • любой имеет touch утилита в Вашей системе (который я делаю)
  • , или может позволить себе временно изменить системную дату с помощью date команда (который является, вероятно, не случаем, но кто знает)

, Вот идея:

  1. В целевом каталоге, создайте файл сигнала (с уникальным именем), и с меткой времени, равной Вашему пороговому времени удаления. Это может быть сделано с touch (который принимает желаемую метку времени в качестве параметра), или путем запоминания текущей даты с date /T, изменения системной даты на желаемый с date <param> и восстановления исходной даты.

  2. Использование for /f %%I in ('dir /od') для итерации по всем файлам, заказанным по дате, удаляя их один за другим. После того, как Вы встретитесь (и удалите), файл сигнала, прекратите удалять.

1
ответ дан 1 December 2019 в 01:46
поделиться

Интересно, почему необходимо использовать ole оболочку DOS... Windows Powershell Python или был бы правильным выбором в 2008 :)

0
ответ дан 1 December 2019 в 01:46
поделиться

Я не знаю, можно ли сделать это с.BAT файлами и с чем немногими инструментами Windows идет, но Вы верная банка с .js (JScript) или .vbs (VBScript) файлы. Вы делаете это в соответствии с Windows, правильно? Если так, затем Windows может обработать .js и .vbs файлы точно так же как .bat файлы по умолчанию. Они намного более мощны.

И, если Вы, оказывается, нацелены только на Windows Server 2008, существует PowerShell, который еще лучше (загружаемый для других версий Windows).

-1
ответ дан 1 December 2019 в 01:46
поделиться

eJames: Я обнаружил, что ваше решение xcopy действительно работает очень хорошо! Что мне больше всего нравится в нем, так это то, что он должен работать и в других языковых версиях Windows, кроме английского, поскольку формат параметров XCOPY, похоже, не зависит от установки даты. Замечательно! ;]

Одним из улучшений было бы предварительное создание файла FILES_TO_KEEP.TXT, чтобы, если ни один файл не соответствует критериям сохранения, второй оператор XCOPY все еще мог продолжить и выполнить удаление (он терпит неудачу, если не может найти FILES_TO_KEEP. TXT файл). Вот мой сценарий (обратите внимание, что в этом примере я изменил его, чтобы удалить только файлы * .pdf, и я также изменил имя временного файла, чтобы убедиться в отсутствии потенциальных конфликтов, а также очистил временный файл впоследствии):

@echo off
SET OLDERTHAN=%1
IF NOT DEFINED OLDERTHAN GOTO SYNTAX

echo >> ~~~FILES_TO_KEEP.TXT~
for /f "tokens=*" %%a IN ('xcopy *.pdf /d:%1 /L /I null') do if exist %%~nxa echo %%~nxa >> ~~~FILES_TO_KEEP.TXT~
for /f "tokens=*" %%a IN ('xcopy *.pdf /L /I /EXCLUDE:~~~FILES_TO_KEEP.TXT~ null') do if exist "%%~nxa" del "%%~nxa"
del ~~~FILES_TO_KEEP.TXT~

GOTO END

:SYNTAX
ECHO.
ECHO USAGE:
ECHO DELOLD mm-dd-yyyy
ECHO   Where mm-dd-yyyy is the date prior to which you want to delete files.
ECHO.
ECHO EX: "DELOLD 10-17-2008" Deletes files older than October 17, 2008.
ECHO.
ECHO This should work on any language version of Windows, but has only been 
ECHO tested in English-US versions.
GOTO END

:END
6
ответ дан 1 December 2019 в 01:46
поделиться

Если вы находитесь на сервере Windows и/или у вас установлен комплект ресурсов сервера, forfiles может быть именно тем, что вы ищете.

Примеры: распечатать все имена файлов, старше 180 дней

forfiles /S /D -180 /C "cmd /C Echo @Path" >olderthan180days.txt

удалить все PDF файлы, старше 365 дней

forfiles /S /M *.pdf /D -365 /C "cmd /C Del @Path"
10
ответ дан 1 December 2019 в 01:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: