2009-07-27 2 views
1

Я пытаюсь написать небольшой пакетный скрипт, который будет удалять файлы из старого каталога. Первый параметр - это каталог для скрипта, для которого требуется посмотреть, а второй - количество сохраняемых файлов.Batch Scripting, для использования результатов поиска

rem @ECHO OFF 

rem %1 is the path in which to look for the files 
rem %2 is the number of recent files to preserve 

if [%1] EQU [] (
    echo ERROR: Missing Required Paramater directory path. 
    goto :eof 
) 

if [%2] EQU [] (
    echo ERROR: Missing Required Paramater, number of files to preserve 
    goto :eof 
) 

if %2 LSS 0 (
    echo ERROR: Number of files to preserve provided was negative 
    goto :eof 
) 

set FolderPath=%1 
set SafeNumber=%2 

cd %FolderPath% 

for /f %%f in ('dir /O-D /A-D /B') do call :delete %%f 
goto :eof 

:delete 
if %SafeNumber% LEQ 0 (
    del %1 
) else (
    set /a SafeNumber-=1 
) 
goto :eof 

:eof 

По сути то, что я вот реж, который выводит список имен файлов, упорядоченных от нового к старому. В зависимости от того, что такое SafeNumber, он пропустит первые несколько файлов, а затем обработает удаление после того, как SafeNumber < = 0.

Проблема, с которой я столкнулся сейчас, это если имя файла «Test File.txt» (as in содержит пробел. «Тест» передается в delete как% 1, а не «Test File.txt».

Любые идеи о том, как заставить мой скрипт работать, или, возможно, у кого-то есть лучшее письменное решение?

ответ

2

Вы пробовали помещать кавычки вокруг имени файла на своем входе или в вашем скрипте? Я имею в виду около% f или% 1 для сценария.

+0

Изменен для постановки быть: для/F "delims =" %% е в ('реж/OD/AD/B % FolderPath% ') делают вызов: удалить «%% f» , и теперь удаление получает полное имя файла. Котировки помогли кучу, не подумали об этом. –

0

Для обработки пробелов в именах файлов и т. Д. Вы хотите указать для имен файлов и путей «% 1» и т. Д. Возможно, это ваша единственная проблема.

0

вам понадобится использовать команду find с -newer, а затем -exec rm. Например, чтобы удалить все файл новее, чем file.txt сделать:

find . -type f -newer file.txt -exec rm {} \; 
+1

Он задает вопрос о пакетных файлах DOS/Win, а не оболочке Unix! –

+0

дать cygwin попытку – ennuikiller

+0

команда поиска unix была перенесена в Windows. для вышесказанного это будет-> найти c: \ path -type f -newer file.txt -delete – ghostdog74

0

Долгое время назад я написал простой Java прогу, которая должна быть запущена из консоли, то есть из пакетного файла. Прог удаляет старые файлы из указанного каталога. Проверьте это here. На самом деле я не помню, как именно это работает, но я бы предложил использовать его сначала в тестовой папке. Предполагается, что он будет использоваться для Windows, по крайней мере там, где я его использовал.

теперь я перешел на Mac, где я использую следующий Automator скрипт я запускаю каждый раз при загрузке для выполнения этого задания:

find /Users/<yourUser>/Downloads/* -type f -mtime +90 -exec mv -f {} /Users/<yourUser>/.Trash \; 
0

Измените свой цикл, и избавиться от вашей функции удаления.

for /f "skip=%safenum%" %%f in ('dir /o-d /a-d /b') do (del %%f) 

У меня есть нездоровая любовь для петель ...

Смежные вопросы