从文件夹中复制某些文件 - 并给每个文件一个日期戳
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_20220427
、file2_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)
}
我有一个脚本可以查找特定的文件名,并将它们复制到另一个目的地。 没问题,我需要帮助的是在目标文件夹中给每个文件一个_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_20220427
、file2_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)
}