【问题标题】:Copying Files to Another Folder While Keeping a Single Parent Directory在保留单个父目录的同时将文件复制到另一个文件夹
【发布时间】:2019-07-12 08:01:43
【问题描述】:

我还是 PowerShell 的新手,我正在尝试做一些我还没有看到确切答案的事情。我们有一个包含许多子文件夹的大文件夹,其中包含单独的音频文件(我们的电话系统记录并按日期将音频文件放置在文件夹中)。我想从这些文件夹中获取某些文件并将它们移动到不同的文件夹,但我想在新位置创建文件来自的父文件夹。我没有抓取文件夹中的所有文件,只有几个。例如:

我想在 C:\CopyFrom\02182019\AudioFile.wav 移动一个文件

我在 C:\CopyTo 有一个文件夹,但我希望目的地是 C:\CopyTo\02182019\AudioFile.wav

如果文件夹不存在,我希望脚本创建该文件夹,但如果存在,则将文件复制到该文件夹​​中。

我目前正在使用Get-ChildItem -Include 来获取我需要的文件并将其传送到我在网上找到的 foreach 循环中。这与我所需要的一样接近,但它复制了整个文件夹结构,从根目录开始,所以我的目的地最终是: C:\CopyTo\CopyFrom\02182019\AudioFile.wav

这是我目前所拥有的:

Get-ChildItem $SourceFolder -Include $ExtArray -Recurse | forEach {
## Remove the original  root folder

  $split = $_.Fullname  -split '\\'

  $DestFile =  $split[1..($split.Length - 1)] -join '\' 

  ## Build the new  destination file path

  $DestFile =  "C:\DestinationFolder\$DestFile"

  ## Copy-Item won't  create the folder structure so we have to 

  ## create a blank file  and then overwrite it

  $null = New-Item -Path  $DestFile -Type File -Force

  Copy-Item -Path  $_.FullName -Destination $DestFile -Force

}

我在this article 中找到了foreach 循环。我假设我可以在 $split 行中添加更多内容,这将允许我削减目录结构的其余部分,但我对此仍然很陌生,并且对语法理解得不够好。

我知道这解释起来有点复杂,所以如果需要任何澄清,请告诉我。

【问题讨论】:

    标签: powershell


    【解决方案1】:

    试试这个:

    $ExtArray = "keep"
    $SourceFolder = "C:\source"
    $DestFolder = "C:\dest"
    
    Get-ChildItem $SourceFolder -Recurse -Include "*keep*"  | foreach {
    
        $source_dir = $_.DirectoryName
        $dest_dir = $_.DirectoryName.replace($SourceFolder, $DestFolder)
    
        if (Test-Path $dest_dir) {
          Copy-Item -Path $_ -Destination $dest_dir -Recurse
        } else {
          New-Item -Path $dest_dir -ItemType "directory" | out-null
          Copy-Item -Path $_ -Destination $dest_dir -Recurse
        }
    
    }
    

    【讨论】:

    • 这看起来是正确的轨道,但如果有意义的话,需要从源文件夹中动态拉取目标文件夹。每天都会从我们的电话系统为当天的录音创建一个新文件夹。我希望脚本能够扫描整个顶级文件夹,使用 -Include 检查子文件夹中的音频文件是否有某个字符串,然后将这些音频文件移动到目标位置,同时复制它的父目录。我希望这是有道理的。
    • 我之前无法发表评论,所以我不得不发布一个答案,但看看这是否能满足您的需求。
    • @TheLukeBagel -errorAction 是因为如果文件已经存在,Copy-Item 将显示错误。我们可以添加一个条件检查并跳过该文件,如果它存在于目的地。
    • 对于迟到的回复,我们深表歉意,我们有另一个项目将其暂时推到一边。我刚刚在这里尝试了你的建议,它让我非常接近。但是,它似乎是在复制整个文件夹,而不是从 Get-ChildItem 传输的列表。目标文件夹也非常接近我的需要,因为它会根据需要创建父文件夹,但它还会在目标文件夹中创建该文件夹的另一个副本并将所有文件再次复制到该文件夹​​,所以我结束了加上 C:\target\folder1\audiofiles 和 C:\target\folder1\folder1\sameaudiofiles。
    • 添加了另一个示例。
    【解决方案2】:

    这是我的尝试——我将顶级目录设置为一个变量,将底层文件夹结构设置为另一个。

    $File = "C:\test\IT\testfile.docx"
    $Destination  = "C:\test2\"
    $test2 = "\IT\"
    
    mkdir "$Destination\$test2"
    Copy-Item -Path $File -Destination "$Destination\$test2" -recurse
    

    我不确定如何在您当前的代码中实现这一点,但希望它能让车轮旋转起来,并让您朝着正确的方向前进!

    【讨论】:

    • 这不只是创建 C:\test2\IT 并将所有内容放在那里吗?有没有办法让 $test2 变量提取文件来自的第一级父目录名称?这些文件中的每一个都可能来自不同的子目录,但我想保留它们的单个第一级父目录。我原始帖子中的 forEach 块让我非常接近,但添加了完整的文件路径减去 C:。我想删除最后一个子目录\文件名之前的所有内容。
    猜你喜欢
    • 1970-01-01
    • 2018-09-28
    • 2013-05-21
    • 1970-01-01
    • 1970-01-01
    • 2017-08-14
    • 2021-02-25
    • 2015-10-17
    • 2015-05-05
    相关资源
    最近更新 更多