Обновить файл или папку Дата изменения
Мне нужно обновить свойство "Дата изменения" файлов и папок, поскольку они копируются из одного места в другое, чтобы "Дата изменения" = Текущее системное время. У меня есть компьютер с 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 /?
для всех вариантов.