Powershell获取文件的父文件夹

Mik*_*ell 12 powershell

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

例如:

C:\StuffToCopy\Folder1\myFile1.txt
C:\StuffToCopy\Folder1\myFile2.txt
C:\StuffToCopy\Folder2\myFile1.txt
C:\StuffToCopy\Folder2\myFile2.txt
Run Code Online (Sandbox Code Playgroud)

在我的复制过程结束时,我只收到2个文件,但我想要4个.

我希望输出如下:

C:\ArchiveCopy\Folder1_myFile1.txt
C:\ArchiveCopy\Folder1_myFile2.txt
C:\ArchiveCopy\Folder2_myFile1.txt
C:\ArchiveCopy\Folder2_myFile2.txt
Run Code Online (Sandbox Code Playgroud)

到目前为止,这是我的脚本.

$files = dir -r -path "C:\StuffToCopy\" -i *.*

foreach ($file in $files)
{
    if ($file.LastWriteTime -gt (get-date).AddDays(-1)) {
        copy -path $file C:\ArchiveCopy\
    }
}
Run Code Online (Sandbox Code Playgroud)

我想做点什么 copy -path $file.FolderName & '_' & $file C:\ArchiveCopy\

我只是不确定该怎么做.

Ric*_*ard 13

如果$file它确实是一个文件 - 一个实例System.IO.FileInfo(而不是一个真正的目录System.IO.DirectoryInfo:) Directory,那么它的属性是一个实例,DirectoryInfo其中包含Name:

$file |
  copy-item -destination { 
     Join-Path C:\ArchiveCopy\ -childpath ($_.Directory.Name + "_" + $_.Name) }
Run Code Online (Sandbox Code Playgroud)

(使用管道启动,因为-LiteralPath参数将从管道Copy-Item绑定到PSPath属性,因此无需从$file对象中提取原始文件的名称.)

如果$file可能是目录,那么您需要自己完成更多工作,但可能更容易首先过滤掉目录:

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

注意:

  • 无需保存所有文件对象然后循环它们:让管道执行循环
  • 不需要-i "*.*":这是默认的(如果你需要过滤通配符模式上的文件更喜欢-filter pattern参数:过滤器被传递到文件系统而不是创建.NET对象,然后过滤它们,如果有的话,它会慢得多很多文件).


Sha*_*evy 6

试试这个:

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


nim*_*zen 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
    }
}
Run Code Online (Sandbox Code Playgroud)