简体   繁体   中英

Touch file to update the date/time of file? (Modified Date) (WindowsXP BatchScript)

What's a batch script command to touch on a file to update its date and time to the current date and time? (Modified Date)

For example, Joe Blow sends me a text document which he created months ago, when he emails me the document, I want to keep track of how old it is from the day I received it (not when he created it) so I want to update the file's date/time to the current date/time.

I have a batch script to automatically weed out files that haven't been edited within 90 days, so this is troublesome when I receive a particularly older file then all of a sudden it disappears.

And I need it via a batch script as I have hundreds of files to manage, and it's for archiving files.

I can't take all the credit, but I did look through my todo.txt to find it

Microsoft "touch" it's a KB article from like 5 years ago

The jist of it is you use copy /b MYFILENAME +,, where MYFILENAME is your file

This is an expansion on aflat's anwer.

1) Microsoft support provides an explanation and simple touch.bat script. 2) My custom touch.cmd, which expands on the MS script by including "touch /?" help text. 3) My custom midastouch.cmd, which provides several options including recursive operation and date operations.

As aflat wrote, the simple answer is:

copy /b FILENAME +,,

As you might expect, FILENAME can include relative or absolute path and wildcards like *.txt.

1. Microsoft 1 support:

The following MS-DOS command updates the date and time stamps of a file named "EXAMPLE" without altering the contents of the file. This is similar to the TOUCH utility found in XENIX and in some third-party MS-DOS toolkits.

COPY /B EXAMPLE +,,

The COPY command can concatenate a file onto an existing file when used in the form:

COPY FILE1+FILE2

In this example, the contents of FILE2 are appended to FILE1, leaving FILE2 unchanged. When copying in this mode, the COPY command switches to ASCII mode where the ^Z (0x01A) end-of-file marker is honored.

Therefore, with the above command, the /b forces the COPY command into binary mode, the filename is the file to be updated, the + (plus sign) indicates that a file is to be appended, and the ,, (commas) are placeholders for the remaining parameters (which are not included in this example). Because the file to be appended is not specified, the COPY command will append nothing and only update the time and date stamps for the file.

The following batch file, TOUCH.BAT, can be used to automate the process:

@echo off    
if %1.==. goto end    
if not exist %1 goto end    
copy /b %1 +,, > nul    
echo %1 touched!    
:end

This batch file requires one parameter, the file to be "touched." If the parameter is not supplied, line 2 will cause the batch file to exit without doing anything. If the specified file does not exist, line 3 will cause the batch file to exit also.

2. Touch.cmd

@echo off
:: -----------------------------------------
:: Process input parameter
:: -----------------------------------------

: Help requestes?
if "%1%"=="/?" goto help
if "%1%"=="?" goto help
if "%1%"=="" goto help

:: -----------------------------------------
:: Update Modified Date property to now
:: -----------------------------------------
if not exist %1% goto end    
copy /b %1% +,, > nul    
echo %1 touched!    
goto end

:help

@echo off
echo :: --------------------------------------------------------------
echo :: Touch.cmd Help
echo :: --------------------------------------------------------------
echo.
echo Touch.cmd is batch script to update the Modified Date property 
echo of teh specified file to the current
echo date and time.  
echo.
echo Syntax: touch filename
echo         where,
echo         filename is the name of the name of the file to "touch."
echo         filename may include a relative o full path.
echo         filename may include wild cards like *.txt.
echo.

:end

3. MidasTouch.cmd

@echo off
:: -----------------------------------------
:: Find files older than specified date
:: -----------------------------------------

:: -----------------------------------------
:: Default Values
:: -----------------------------------------
set "default_path=%cd%"
set "default_err_log=%cd%\midastouch_err.log"
set /a default_date=-365
set "open_log=False"
set "recurse=True"

:: -----------------------------------------
:: Process input parameters 
:: -----------------------------------------

: Help requestes?
if "%1%"=="/?" goto help
if "%1%"=="?" goto help
if /I "%1%"=="help" goto help

set "dir_in="
set "err_log="
set "dd="

:: Read in commandline arguements.
echo Arguements:
:arguement_loop
    if "%1%"=="/p" (
        echo     Path: %2%
        set dir_in=%2%
        shift
        goto loop_bottom)
    if "%1%"=="/l" (
        echo     Error log: %2%
        set err_log=%2%
        shift
        goto loop_bottom)    
    if "%1%"=="/-l" (
        echo     No error log.  Output to console.
        set err_log=CON
        shift
        goto loop_bottom)    
    if "%1%"=="/d" (
        echo     Date: %2%
        set /a dd=%2% 
        shift
        goto loop_bottom)
    if "%1%"=="/o" (
        echo     Open log: True
        set "open_log=True"
        goto loop_bottom)
    if "%1%"=="/-o" (
        echo     Open log: False
        set "open_log=False"
        goto loop_bottom)
    if "%1%"=="/s" (
        echo     Recursive: True
        set "recurse=True"
        goto loop_bottom)
    if "%1%"=="/-s" (
        echo     Recursive: False
        set "recurse=False"
        goto loop_bottom)
    if not "%1%"=="" (
        if "%dir_in%"=="" (
            echo     Path: %1%
            set dir_in=%1%
            goto loop_bottom)
        if "%err_log%"=="" (
            echo     Error log: %1%
            set err_log=%1%
            goto loop_bottom)
        if "%dd%"=="" (
            echo     Date: %1%
            set /a dd=%1%
            goto loop_bottom)
    )
:loop_bottom
shift
if not "%1%"=="" goto arguement_loop

if "%dir_in%"=="" ( 
    set dir_in=%default_path%)
if "%err_log%"=="" ( 
    set err_log=%default_err_log%)
if "%dd%"=="" ( 
    set /a dd=%default_date%)

:: -----------------------------------------
:: Execution
:: -----------------------------------------

:: Write header
set "header=Touch_dir.cmd Error Log"
if exist %err_log% (
    del /q %err_log%)
@echo %header% >%err_log%

set cmd_str="cmd /c copy /b @path +,,"

:: Update Modified Date property to now
if /I "%recurse%"=="True" (
    set cmd_str=forfiles /s /p %dir_in% /d %dd% /c %cmd_str%
) else (
    set cmd_str=forfiles /p %dir_in% /d %dd% /c %cmd_str%
)
echo Command: %cmd_str% >>%err_log%
echo Errors: >>%err_log%
echo. >>%err_log%
echo Executing command: %cmd_str%
@echo Updating Modified Date of files older than date: %dd%.
@echo This may take a while.  Please be patient...
@echo.
echo.
set cmd_str=%cmd_str% || @echo Failed to update: @path >>%err_log%"
%cmd_str%

:: Results
@echo Error log: %err_log% 
if "%open_log%"=="True" (start %err_log%)

goto end

:help
@echo off
echo :: --------------------------------------------------------------
echo :: Touch_dir.cmd Help
echo :: --------------------------------------------------------------
echo.
echo Touch.cmd is batch script to recursively "touch" all files in a
echo folder to update their Modified Date property to the current
echo date and time.  
echo.
echo Syntax: touch_dir /d directory /l err_log /m months
echo         where,
echo         /p  path       Path containing files with Modified
echo                        Date values to update to now.
echo                        (default = current directory).
echo         /s  (or /-s)   Recursive (or not recursive) search 
echo                        (default recursive is %recurse%).
echo         /l  err_log    Error log: list of files not updated
echo                        (default err_log: midastouch_err.log).
echo         /o  (or /-o)   Open (or do not open) error log after 
echo                        execution (default open_log: %open_log%).
echo         /d  date       Selects files with a last modified date greater
echo                        than or equal to (+), or less than or equal to
echo                        (-), the specified date using the
echo                        "MM/dd/yyyy" format; or selects files with a
echo                        last modified date greater than or equal to (+)
echo                        the current date plus "dd" days, or less than or
echo                        equal to (-) the current date minus "dd" days. A
echo                        valid "dd" number of days can be any number in
echo                        the range of 0 - 32768.
echo                        "+" is taken as default sign if not specified.
echo                        (default date is: %default_date%).
echo.

:end

Just to add that the same source provide a batch script.

@echo off
goto start

:usage
echo usage: TOUCH.BAT "MYFILENAME"
exit /b 0

:start
if %1.==. goto usage
if not exist %1 goto usage
copy /b %1 +,, > nul
echo %1 touched!
exit /b 0

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM