Обновить файл или папку Дата изменения

Мне нужно обновить свойство "Дата изменения" файлов и папок, поскольку они копируются из одного места в другое, чтобы "Дата изменения" = Текущее системное время. У меня есть компьютер с Windows 7, и у меня нет прав администратора, поэтому я не могу устанавливать какие-либо пользовательские утилиты. Мой текущий файл bat использует XCOPY:

xcopy "\\sharepoint\dept\gis\Abandoned_Wire\*.*" "\\corp.dom\fs4\g1\OUTPUT\GRIDPROD\PDF\Maps\Abandon Wire Maps" /c /s /r /y /i

На моем Windows XP я использую команду "touch" из UnxUtils, но я не могу найти эквивалент, который является родным для Windows 7. Спасибо!

4 ответа

Существует очень простой (хотя и загадочный) синтаксис для "прикосновения" к файлу в Windows. (обновить последнюю измененную метку времени)

Если файл находится в текущем каталоге, все, что вам нужно, это:

copy /b fileName+

Если файл находится по другому пути, то это работает:

copy /b somePath\fileName+,, somePath\

Тем не менее, похоже, что вам все равно придется много писать, поскольку я считаю, что вы хотите только касаться копируемых файлов.

Следующее не проверено, хотя я считаю, что это будет работать. Я не могу поручиться за представление. Это решение требует 2 неиспользуемых букв дисков. Я предполагаю, что K: и L: доступны.

@echo off

:: map unused drive letters to your source and target paths
subst K: "\\sharepoint\dept\gis\Abandoned_Wire"
subst L: "\\corp.dom\fs4\g1\OUTPUT\GRIDPROD\PDF\Maps\Abandon Wire Maps"

:: replicate the folder hierarchy
xcopy K: L: /t

:: recursively copy and touch all files
for /r K: %%F in (*) do (
  xcopy "%%F" "L:%%~pnxF" /r /y
  copy /b "L:%%~pnxF"+,, "L:%%~pF"
)

:: release the temporary drive mappings
subst /d K:
subst /d L:

Вы могли бы использовать powershell, который я считаю, уже установлен в Windows 7 по умолчанию. Добавьте эту строку в ваш пакетный файл, чтобы запустить команду powershell, которая обновляет отметку времени для всех файлов с именем Abandoned_Wire*.*:

powershell.exe -command "ls 'folder\Abandoned_Wire\*.*' | foreach-object { $_.LastWriteTime = Get-Date }"

То, что делает эта строка, просто:

-command: сообщает PowerShell выполнить следующую команду и немедленно вернуться

ls: список всех подходящих файлов по указанному пути

foreach-object: запустить следующий блок для каждого файла, который ls найденный

$_.LastWriteTime = Get-Date: для каждого файла установите LastWriteTime на значение, возвращаемое Get-Date (сегодняшняя дата и время)

Robocopy должен быть в состоянии сделать это для вас. robocopy это родной инструмент, включенный в Windows начиная с Vista.

robocopy "\sharepoint\dept\gis\Abandoned_Wire" "\corp.dom\fs4\g1\OUTPUT\GRIDPROD\PDF\Maps\Abandon Wire Maps" /COPY:DA /S /IS

По умолчанию robocopy будет копировать DAT: Данные, атрибуты и метки времени, но это можно контролировать с помощью /COPY флаг.

Увидеть robocopy /? для всех вариантов.

for /R %i in (\*.\*) do copy %i /B+ ,,/Y
Другие вопросы по тегам