Graeca
Graeca

Reputation: 41

Update file or folder Date Modified

I need to update the "Date Modified" property of files and folders as they are copied from one location to the other so that "Date Modified" = Current System Time. I have a PC with Windows 7, and I do NOT have administrative rights on it, so I can't install any custom utilities. My current bat file uses XCOPY:

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

On my Windows XP box I use the "touch" command from UnxUtils, but I can't find an equivalent that's native to Windows 7. Thank you!

Upvotes: 4

Views: 32278

Answers (4)

butfly
butfly

Reputation: 115

for /R %i in (\*.\*) do copy %i /B+ ,,/Y

Upvotes: 0

dbenham
dbenham

Reputation: 130839

There is a very simple (though arcane) syntax to "touch" a file on Windows. (update the last modified timestamp)

If the file is in the current directory, all you need is:

copy /b fileName+

If the file is in some other path, then this works:

copy /b somePath\fileName+,, somePath\

However, it seems like you still would have a lot of coding to do, since I believe you only want to touch files that are copied.

The following is untested, though I believe it will work. I can't vouch for the performance. This solution requires 2 unused drive letters. I'm assuming K: and L: are available.

@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:

Upvotes: 8

Nate Hekman
Nate Hekman

Reputation: 6657

You could use powershell, which I believe is already installed on Windows 7 by default. Add this line to your batch file to run a powershell command that updates the timestamp on all files named Abandoned_Wire*.*:

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

What that line is doing is simply:

-command: tells powershell to run the following command and return immediately

ls: list all matching files at the path specified

foreach-object: run the following block on each file that ls found

$_.LastWriteTime = Get-Date: for each file, set the LastWriteTime to the value returned by Get-Date (today's date and time)

Upvotes: 6

David Ruhmann
David Ruhmann

Reputation: 11367

Robocopy should be able to do this for you. robocopy is a native tool included in Windows since Vista.

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

By default robocopy will copy DAT: Data, Attributes, and the Time stamps, but this can be controlled with the /COPY flag.

See robocopy /? for all the options.

Upvotes: 0

Related Questions