从文件夹中复制某些文件 - 并给每个文件一个日期戳

Copy certain files from folder - and give each file a date-stamp

我有一个脚本可以查找特定的文件名,并将它们复制到另一个目的地。 没问题,我需要帮助的是在目标文件夹中给每个文件一个_date/time

喜欢复制的文件file1取名file1_20220427

我现在的脚本如下:

$search_folder = "H:\SOURCE"
$destination_folder = "H:\DEST"
$file_list =  @("file1","file2")
foreach ($file in $file_list) 
{
$file_to_move = Get-ChildItem -Path $search_folder  | % { $_.FullName}
if ($file_to_move) 
{
    Copy-Item $file_to_move $destination_folder
}
}

在不修改太多代码的情况下,不需要 foreach 循环,因为您可以直接通过管道传输到 Copy-Item:

$search_folder      = "H:\SOURCE\*"
$destination_folder = "H:\DEST\"
$file_list          =  "file1*","file2*"
Get-ChildItem -Path $search_folder -Include $file_list -File|
    Copy-Item -Destination { 
        $destination_folder +  ($_.BaseName + "_" + (Get-Date).ToString("yyyyMMdd") + $_.Extension)  
    } 

这是可行的,因为 Copy-Item 可以接受脚本块,您可以在其中修改目标路径以包含串联结果。所需要的只是提供目标路径,basename 属性 保留名称的开头,附加 yyyMMdd 格式的日期,以及扩展名以保持文件类型。

另外,请注意 -Include 的用法。此参数可以接受一个名称数组来搜索您需要提供全名的位置(包含扩展名),或者其中的一部分带有通配符(星号 - *) 允许我们摆脱 foreach 语句。

  • 使用 -Include 时的唯一问题是它是 PowerShell 的 解决方案来提供搜索过滤器,而不是基于文件系统提供程序的解决方案。
  • 因此,源路径必须在文件夹路径末尾包含一个星号,否则需要使用-Recurse

现在,您的文件名应该在您的目标文件夹中相应地反映 file1_20220427file2_20220427 等等。

编辑:根据您在评论中的问题,您可以只针对路径进行测试以查看是否存在具有该日期的文件夹,如果没有则创建文件夹,然后现在就把物品送到那里;如果该项目也已存在,它将复制该项目。

$search_folder      = "H:\SOURCE\*"
$destination_folder = "H:\DEST\"
$file_list          =  "file1*","file2*"
Get-ChildItem -Path $search_folder -Include $file_list -File |
    Copy-Item -Destination { 
        $dateFormat = (Get-Date).ToString("yyyyMMdd")
        $destPath   = Join-Path -Path $destination_folder -ChildPath $dateFormat 
            if (-not(Test-Path -LiteralPath $dateFormat)) { New-Item -Path $destPath -ItemType "Directory" | Out-Null }
        "$destPath\" +  ($_.BaseName + "_" + $dateFormat  + $_.Extension)  
    }