Powershell获取文件的父文件夹

时间:2011-09-16 13:14:47

标签: powershell

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

例如:

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 个答案:

答案 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
    }
}