我正在编写一个脚本,用于归档文件以供分析。我的问题是文件名在多个文件夹中不是唯一的,所以它们被覆盖了。
例如:
C:\StuffToCopy\Folder1\myFile1.txt
C:\StuffToCopy\Folder1\myFile2.txt
C:\StuffToCopy\Folder2\myFile1.txt
C:\StuffToCopy\Folder2\myFile2.txt
在我的复制过程结束时,我只收到2个文件,但我想要4个。
我希望输出如下:
C:\ArchiveCopy\Folder1_myFile1.txt
C:\ArchiveCopy\Folder1_myFile2.txt
C:\ArchiveCopy\Folder2_myFile1.txt
C:\ArchiveCopy\Folder2_myFile2.txt
到目前为止,这是我的脚本。
$files = dir -r -path "C:\StuffToCopy\" -i *.*
foreach ($file in $files)
{
if ($file.LastWriteTime -gt (get-date).AddDays(-1)) {
copy -path $file C:\ArchiveCopy\
}
}
我想做copy -path $file.FolderName & '_' & $file C:\ArchiveCopy\
我只是不确定该怎么做。
答案 0 :(得分:13)
如果$file
实际上是一个文件 - System.IO.FileInfo
的实例(而不是真正的目录:System.IO.DirectoryInfo
),那么它具有属性Directory
,它是{的一个实例{1}} DirectoryInfo
:
Name
(使用管道启动是因为$file |
copy-item -destination {
Join-Path C:\ArchiveCopy\ -childpath ($_.Directory.Name + "_" + $_.Name) }
的{{1}}参数将绑定到管道中的-LiteralPath
属性,因此无需从{{{ 1}}对象。)
如果Copy-Item
可能是目录,那么您需要自己完成更多工作,但可能更容易首先过滤目录:
PSPath
注意:
$file
:无论如何这是默认设置(如果您需要过滤通配符模式上的文件,请更喜欢$file
参数:过滤器将传递给文件系统而不是创建.NET对象然后过滤它们,如果有很多文件则会慢得多。)答案 1 :(得分:6)
试试这个:
dir -r -path C:\StuffToCopy |
where {!$_.psiscontainer} |
copy -dest { "C:\ArchiveCopy\$($_.Directory.Name)_$($_.Name)"}
答案 2 :(得分:5)
根据您的脚本,这是另一种方法:
$files = dir -r -path "C:\StuffToCopy\" -i *.*
$destPath = "c:\ArchiveCopy\"
foreach ($file in $files)
{
$folderPath = Split-Path $file.fullname -parent
$folder = Split-Path $folderPath -leaf
$destFilename = $folder + "_" + $file.name
$destFileFullPath = $destPath + $destFilename
write-host $destFileFullPath
if ($file.LastWriteTime -eq (get-date).AddDays(0)) {
copy -path $file $destFileFullPath
}
}