1

Я пытаюсь создать файл .bat, чтобы переместить файлы из одной папки в другую на основе самого старого файла с отметкой времени.

Папка 1:

Filename:        Date Modified:
test1.dat        5/12/2014 4:03pm
test2.dat        5/12/2014 4:04pm

Цель состоит в том, чтобы переместить самый старый файл в папку 2. В настоящее время мой пакетный файл ниже перемещает все из папки 1 в папку 2, очевидно, потому что у меня нет введенного кода, связанного со временем.

set Delay=10
move /-y "C:\Users\bingersoll001\Desktop\folder1\*.dat" "C:\Users\bingersoll001\Desktop\folder2"
timeout 10 /nobreak
call move.bat

Есть ли способ сделать это?

2 ответа2

2

Если вы используете относительно новую версию Windows (Vista или новее), я бы порекомендовал вам использовать PowerShell. Там гораздо проще выполнить такую задачу. Вы также можете установить PS на XP, если хотите.

gci | where {!$_.PSIsContainer} | sort LastWriteTime | select -f 1 | move -destination "C:\some\path\"

Или, если у вас есть PS 3.0/Windows 8:

gci -file | sort LastWriteTime | select -f 1 | move -destination "C:\some\path\"

Объяснение:

  • gci - сокращение от Get-ChildItem . Он получает все файлы в каталоге. -file заставляет возвращать только файлы, без каталогов. Аналогично dir и ls .

  • where - сокращение от Where-Object . Отфильтруйте вход по некоторому условию. До PS 3.0, -file не существует для gci так что необходимо было использовать , where фильтр.

  • sort - Сокращение от Sort-Object возрастанию по LastWriteTime .

  • select - Сокращение от Select-Object . Возьмите только первый (-f 1) результат.

  • move - сокращение от Move-Item . Перемещает результат предыдущего конвейера в папку -destination .

Дальнейшая помощь доступна с help <commandname> .

2

Следующий пакетный скрипт переместит файл с самым старым временем записи из его исходной папки в целевую.

@echo off
setlocal

set source=C:\Users\bingersoll001\Desktop\folder1
set dest=C:\Users\bingersoll001\Desktop\folder2
set exts=*.dat

pushd "%source%"

for /f "delims=" %%G in ('dir /b /o:d %exts%') do (
move /-y "%%~G" "%dest%"
goto :break
)
:break

popd
endlocal & exit /b

Как это устроено

  1. Отключите функцию отображения команд для менее подробного вывода.

    @echo off
    
  2. Внесите любые изменения в переменные среды, локальные для командного файла.

    setlocal
    
  3. Установите новую локальную переменную с именем source которая содержит путь к исходной папке.

    set source=C:\Users\bingersoll001\Desktop\folder1
    
  4. Как и в предыдущей строке, определите новую локальную переменную для папки назначения.

    set dest=C:\Users\bingersoll001\Desktop\folder2
    
  5. Создает новую локальную переменную, которая содержит расширения файлов для фильтрации. Несколько расширений должны быть разделены точкой с запятой (;).

    set exts=*.dat
    
  6. Изменить текущую рабочую папку.

    pushd "%source%"
    
  7. Выполните команду dir /b /o:d /t:w %exts% , а затем проанализируйте ее вывод. Параметр /b , команда dir отображает пустой список файлов без заголовка или сводки; /o:d делает список отсортированным по дате / времени (самый старый сначала). По умолчанию файлы сортируются по времени последней записи. Часть "delims=" требуется, чтобы избежать проблем с путями к файлам, содержащими пробелы.

    for /f "delims=" %%G in ('dir /b /o:d %exts%') do (
    
  8. Переместите файл в папку назначения.

    move /-y "%%~G" "%dest%"
    
  9. Никакой другой файл не должен быть обработан; перейти к метке :break выходя из цикла for .

    goto :break
    
  10. Восстановите предыдущую рабочую папку и выйдите.

    popd
    endlocal & exit /b
    

дальнейшее чтение

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .