从CSV列表中检查在时间范围内修改的文件

时间:2014-02-23 14:30:52

标签: file powershell robocopy

我有两个问题或两部分问题:

  1. 我有一个包含完整路径的文件列表的CSV文件,例如:

    C:\file1.txt
    C:\file2.xls
    C:\file3.doc
    etc.
    

    我需要检查每个文件的修改日期以及它是否在特定的时间范围内,然后将其输出到新的CSV文件,例如:

    C:\file1.txt has modified time and date 01/01/2014 10:00
    C:\file2.xls has modified time and date 02/01/2014 12:00
    C:\file3.doc has modified time and date 03/01/2014 14:00
    C:\file4.ppt has modified time and date 04/01/2014 16:00
    

    Timespan = 02/01/2014 8:00至03/01/2014 20:00

    output.csv文件应包含:

    C:\file2.xls
    C:\file3.doc
    

    我试图修改我在网上找到的现有PowerShell脚本,但老实说不懂代码。我尝试过使用foreach-object

    $names = get-content .\test.csv
    $names | foreach-object {(get-item $_.name).lastwritetime}
    

    但是我正在努力让这个工作起作用。

  2. 然后我需要将output.csv文件传递给robocopy,它本身不支持它,因此可能需要使用循环来调用robocopy,以复制文件从一个地方到另一个地方。

  3. 希望这是有道理的。

1 个答案:

答案 0 :(得分:2)

如果有多个文件具有相同的文件名,请注意下面的解决方案不起作用。您需要添加的唯一内容是某种形式的源基地址(构建文件结构)和目标基址,并根据这些地址构建新的目标路径。

$copyChangesSince = Get-Date "2014-01-08"
$doNotCopyChangesNewerThan = Get-Date "2014-02-02"
get-content .\files.txt | Foreach {
        Get-Item $_
    } |
    Where { $_.LastWriteTime -gt $copyChangesSince -AND $_.LastWriteTime -lt $doNotCopyChangesNewerThan } |
    Select FullName, Name |
    Export-Csv C:\temp\filelist.csv -NoTypeInformation

由于您只想一次复制一个项目,我不确定是否看到了使用robocopy的好处。在下面的例子中,我刚刚使用了Copy-Item。如果您真的想使用robocopy,那么通过调用robocopy来取代该调用应该不难。

Import-Csv C:\temp\filelist.csv |
    Foreach { Copy-Item -Path $_.FullName -Destination "C:\temp\output\$($_.Name)" }

如果您之后不想实际使用.csv文件,则可以轻松跳过该部分,并使用Select语句替换Export-CsvForeach导入部分(当然也可以跳过Import-Csv)。

编辑:按照问题中的要求将流程拆分为两部分。