如何在Windows中用“创建日期”覆盖“修改日期”?

时间:2014-07-24 09:51:08

标签: file date command-line attributes

我有一个运行Windows服务器的系统,我可以访问Powershell,VBA等。

我需要一种方法来覆盖" Date Modified"目录中所有文件的属性,其日期来自"创建日期"属性。大约有100万个文件需要在10个或更多的子目录中更新,这些子目录分支在一个主目录中。

使用命令行还是Powershell等有一种简单的方法吗?

1 个答案:

答案 0 :(得分:1)

这是一个混合批处理/ javascript文件(将其保存为批处理,按示例touch.cmd),它将重置启动文件夹下所有文件的修改日期时间,将其设置为同一文件的创建日期时间

@if (@This==@IsBatch) @then
@echo off
rem **** batch zone *********************************************************

    setlocal enableextensions disabledelayedexpansion
    set "targetFolder=%~1"
    if not defined targetFolder set "targetFolder=%cd%"

    rem call javascript part of batch file
    cscript //nologo //e:Javascript "%~f0" /startFolder:"%targetFolder%"

    rem End of batch area. End batch execution before reaching js zone
    endlocal
    exit /b

@end
// **** Javascript zone *****************************************************

    if (!WScript.Arguments.Named.Exists('startFolder')) {
        // if no start folder is given, leave
        WScript.Quit(1);
    };

    // retrieve start folder
    var startFolder = WScript.Arguments.Named.Item('startFolder');

    // instantiate needed components
    var fso = WScript.CreateObject('Scripting.FileSystemObject');
    var shell = WScript.CreateObject('Shell.Application');

    // recursive function to set the ModifyDate to the CreationDate
    (function processFolder( folderPath ){
        // test for valid paths
        folderPath = fso.GetAbsolutePathName((folderPath || '' ));
        if (!fso.FolderExists(folderPath)) return ;
        // retrieve a reference to the folder namespace
        var folderNS = shell.NameSpace(folderPath);
        // process files inside this folder
        for (var files = new Enumerator(fso.GetFolder( folderPath ).Files ); !files.atEnd() ; files.moveNext()){
            var file = files.item();
            WScript.StdOut.WriteLine( file.Path );
            folderNS.ParseName( file.Name ).ModifyDate = file.DateCreated;
        };
        // process files under child folders
        for (var folders = new Enumerator(fso.GetFolder( folderPath ).SubFolders); !folders.atEnd() ; folders.moveNext()){
            processFolder( folders.item().Path );
        };
    })( startFolder );

    WScript.Quit(0);