【问题标题】:Coping files from multiple sub folders using powershell使用powershell从多个子文件夹复制文件
【发布时间】:2019-02-07 21:11:26
【问题描述】:

将文件从多个子文件夹复制到另一个多个子文件夹

示例:

C:\Nani\Code\Relase4\database1\tables
C:\Nani\Code\Relase1\database1\tables
C:\Nani\Code\Relase2\database1\tables
C:\Nani\Code\Relase3\cycle1\database1\tables 
C:\Nani\Code\Relase1\database1.02.tables

我在所有文件夹中都有 .sql 文件,我想复制到

C\Build\database1\tables

如果 database1\tables 目录不存在,我也必须创建它,

$sourceFolder  = "C:\Nani\Code"
$targetFolder  = "C\Build"
Get-Childitem $sourceFolder -recurse -filter "*.sql"  -Exclude $exclude | %{
    #If destination folder doesn't exist
    if (!(Test-Path $targetFolder -PathType Container)) {
    #Create destination folder
        New-Item -Path $targetFolder -ItemType Directory -Force
    }
    Copy-Item -Path $_.FullName -Destination $targetFolder -Recurse -force 
}

上面的代码没有在目的地创建子文件夹,

【问题讨论】:

  • 因为它本身并没有进入那个条件。另外,我想知道您在Exclude 参数中传递的内容是什么。
  • $exclude ="*.cs" 文件,能否请您发送脚本
  • 如果您已经使用 *.sql 进行过滤,则不需要使用排除。所以,我已经删除了那部分本身。我已经发布了答案。请相应地修改脚本。 robocopy 还可以将多个源文件夹复制到一个目标,反之亦然。通过ROBOCOPY USAGE

标签: powershell powershell-2.0 powershell-3.0


【解决方案1】:

为了您的理解,我将脚本保持得很简单,并对这些部分进行了评论。 确保为路径和错误处理添加所有验证。否则,如果任何文件出现任何问题,则它将不会继续并会中断循环。

脚本:

#Keeping all the sources in an array
$Sources = @("C:\Nani\Code\Relase4\database1\tables",
"C:\Nani\Code\Relase1\database1\tables",
"C:\Nani\Code\Relase2\database1\tables",
"C:\Nani\Code\Relase3\cycle1\database1\tables",
"C:\Nani\Code\Relase1\database1.02.tables")

$Destination="C\Build\database1\tables\"

#Iterating each source folder
foreach($source in $sources)
{
#Getting all the sql files under an iteration folder recursively 
$files=Get-ChildItem -Path $source -Filter "*.sql" -Recurse 

    #Iterating all the files underneath a single source folder
    foreach ($file in $files) 
    {
    #Copying the files for a single folder to the destination
    Copy-Item $file.PSPath -Destination  ("$Destination" + ($file.PSParentPath | Split-Path -Leaf) + '_' + $file)
    }
}

希望对您有所帮助。

【讨论】:

  • 嗨 Dutta ,我有一个源文件夹 C:\Nani\Code ,在这么多发布文件夹下,现在我想将文件复制到构建文件夹 C\Build\database1\tables 意味着我有一个 10 个发布文件夹,具有类似上述文件夹结构的数据库对象,现在我必须将所有文件复制到单个构建文件夹,如 database1\tables
  • 是的。然后只选择文件并将其移动到目的地。您根本不需要维护目标文件夹中的层次结构。在 foreach 中直接循环所有文件夹,然后选择所有文件,然后直接移动到目标文件夹。
【解决方案2】:

试试这个,我先创建每个文件夹,然后再将文件复制到其中。

$sourceFolder  = "C:\Nani\Code"
$targetFolder  = "C:\Build"
$sources = Get-Childitem $sourceFolder -recurse -filter "*.sql"  -Exclude $exclude | Select FullName, DirectoryName
foreach ($source in $sources)
{
    $Releasepath = [regex]::match($source.DirectoryName,'C:\\Nani\\Code\\Release\d').Value
    $split = $Releasepath.Replace("\","\\")
    $targetfolderLeaf = $source.DirectoryName -split $split | select -Last 1
    $targetfolderpath = $targetFolder+$targetfolderLeaf
    if (!(Test-Path $targetfolderpath -PathType Container)) {
    #Create destination folder
        New-Item -Path $targetfolderpath -ItemType Directory -Force
    }
    Copy-Item -Path $source.FullName -Destination $targetfolderpath -Recurse -force 
}

【讨论】:

  • 我有一个源文件夹 C:\Nani\Code ,在这么多版本文件夹下现在我想将文件复制到构建文件夹 C\Build\database1\tables 意味着我有 10 个版本具有类似上述文件夹结构的数据库对象的文件夹,现在我必须将所有文件复制到单个构建文件夹,如 database1\tables
  • @Nani 我已经编辑了我的答案。希望它是路径中的“释放”而不是“释放”。我认为这应该可以工作,如果没有相应地修改的话。
  • 请不要硬编码路径,只需将路径中的最后一个文件夹名称作为最后一个文件夹名称在目标中创建该文件夹(这么多文件夹在子文件夹中有相同的文件夹),这对我来说也足够了跨度>
  • @Nani 根据您的要求进行修改,如果这对您有用,则将答案标记为有用。
  • 请不要硬编码路径,只需将路径中的最后一个文件夹名称作为最后一个文件夹名称在目标中创建该文件夹(这么多文件夹在子文件夹中有相同的文件夹)我想要这样,你能发送脚本吗
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-14
  • 2019-01-28
  • 2011-09-26
  • 1970-01-01
  • 2015-09-20
  • 1970-01-01
  • 2016-05-17
相关资源
最近更新 更多