Powershell获取文件的父文件夹

17

我正在编写一个脚本,用于归档文件以进行分析。我的问题是文件名在多个文件夹中不是唯一的,因此它们会被覆盖。

例如:

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\的操作。

但我不确定该如何实现。

3个回答

16
如果$file确实是一个文件 - System.IO.FileInfo的实例(而不是目录:System.IO.DirectoryInfo),那么它具有Directory属性,该属性是DirectoryInfo的实例,DirectoryInfo具有一个Name属性:
$file |
  copy-item -destination { 
     Join-Path C:\ArchiveCopy\ -childpath ($_.Directory.Name + "_" + $_.Name) }

使用管道启动,因为Copy-Item-LiteralPath参数将绑定到来自管道的PSPath属性,所以无需从$file对象中提取原始文件名。

如果$file可能是目录,则需要更多自己的工作,但最好首先过滤掉目录:

dir -r -path C:\StuffToCopy\ |
  where { -not $_.PSIsContainer } |
  copy-item -destination { 
     Join-Path C:\ArchiveCopy\ -childpath ($_.Directory.Name + "_" + $_.Name) }

注意:

  • 不需要保存所有文件对象然后对它们进行循环:让管道来完成循环。
  • 不需要使用-i "*.*",因为这是默认设置(如果需要按通配符模式过滤文件,请优先使用-filter pattern参数:该过滤器传递给文件系统,而不是创建.NET对象,然后对它们进行过滤,如果有大量文件,则速度会慢得多)。

8

根据您的脚本,还有另一种方法来完成这个任务:

$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
    }
}

6

试试这个:

dir -r -path C:\StuffToCopy | 
        where {!$_.psiscontainer} | 
        copy -dest { "C:\ArchiveCopy\$($_.Directory.Name)_$($_.Name)"}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接