在PowerShell中以递归方式将一组文件从一个目录复制到另一个目录

时间:2014-09-12 21:21:23

标签: windows powershell powershell-v2.0

我尝试将所有*.csproj.user个文件从C:\Code\Trunk递归复制到C:\Code\F2

例如:

C:\Code\Trunk\SomeProject\Blah\Blah.csproj.user

会被复制到:

C:\Code\F2\SomeProject\Blah\Blah.csproj.user

我目前的尝试是:

  

Copy-Item C:\ Code \ Trunk -Filter * .csproj.user -Destination   C:\ Code \ F2 -Recurse -WhatIf

但是我得到了:

  

如果:执行操作"复制目录"在目标"项目:   C:\ Code \ Trunk Destination:C:\ Code \ F2 \ Trunk"。

首先,它希望将它们全部放在名为F2\Trunk的新文件夹中,这是错误的。其次,它没有列出任何文件。应该有大约10个文件要复制。

该命令的正确语法是什么?谢谢!

更新

好吧,它似乎与C:\Code\F2已经存在的事实有关。如果我尝试将文件复制到 not 的目的地,则可以正常工作。

我想覆盖目标中的任何现有.csproj.user文件。

6 个答案:

答案 0 :(得分:38)

当你真的很简单的时候,你们正在使这个变得非常复杂:

Application.WorksheetFunction.IsNA(rngToCheck.Value)

将复制目录,创建一个" Trunk" F2中的目录。如果您想避免创建顶级Trunk文件夹,则必须停止告诉PowerShell复制它:

Copy-Item C:\Code\Trunk -Filter *.csproj.user -Destination C:\Code\F2 -Recurse

答案 1 :(得分:8)

虽然投票最多的答案对单个文件类型完全有效,但如果您需要复制多种文件类型,则有一个更有用的功能称为robocopy,正是出于此目的,使用更简单

robocopy C:\Code\Trunk C:\Code\F2 *.cs *.xaml *.csproj *.appxmanifest /s

答案 2 :(得分:3)

之前看过这个,我不知道为什么PowerShell似乎无法正确使用(恕我直言)。我会做的更麻烦但是有效。

$Source = 'C:\Code\Trunk'
$Files = '*.csproj.user'
$Dest = 'C:\Code\F2'
Get-ChildItem $Source -Filter $Files -Recurse | ForEach{
    $Path = ($_.DirectoryName + "\") -Replace [Regex]::Escape($Source), $Dest
    If(!(Test-Path $Path)){New-Item -ItemType Directory -Path $Path -Force | Out-Null
    Copy-Item $_.FullName -Destination $Path -Force
}

答案 3 :(得分:2)

我试过Jaykul回答,但这对我没用。我不得不改变它如下,让它工作。我还在它工作之前创建了C:\ Code \ F2文件夹。

Get-ChildItem C:\Code\Trunk Recurse -filter *.csproj.user | Copy -Destination C:\Code\F2

答案 4 :(得分:0)

答案1看起来不错,为了我的目的,我改为Move-Item。但是我发现在每个文件夹中递归遍历,它只移动了第一个文件。下面是我的完整脚本,其中还包括一些doc文件到pdf的转换:

$Source = 'C:\Users\sgrody\Desktop\NSPM-Vol1'
$MoveFiles = '*.PDF'
$Dest = 'C:\Users\sgrody\Desktop\MedPassPDF'
$Folders = Get-ChildItem $Source -Directory -Recurse 


ForEach ($Folder in $Folders)
{
    $wdFormatPDF = 17
    $word = New-Object -ComObject word.application
    $word.visible = $false
    $folderpath = "$($Folder.FullName)\*"
    $fileTypes = "*.docx","*doc"
    Get-ChildItem -path $folderpath -include $fileTypes |
    foreach-object 
    {
     $path =  ($_.fullname).substring(0,($_.FullName).lastindexOf("."))
     "Converting $path to pdf ..."
     $doc = $word.documents.open($_.fullname)
     $doc.saveas([ref] $path, [ref]$wdFormatPDF)
     $doc.close()
    }
    $word.Quit()
}

Get-ChildItem $Source -Filter $MoveFiles -Recurse | ForEach{
    $Path = ($_.DirectoryName + "\") -Replace [Regex]::Escape($Source), $Dest
    If(!(Test-Path $Path)){New-Item -ItemType Directory -Path $Path -Force | Out-Null
    Move-Item $_.FullName -Destination $Path -Force
    }
}

答案 5 :(得分:0)

最近我不得不替换几个子文件夹中的文件,我按如下所述进行操作。

foreach($file in (Get-ChildItem File_you_want_to_be_copied.txt -Recurse)) {$target=$file.directoryname; Copy-Item -path C:\Source_Path\File_you_want_to_be_copied.txt -Destination $target}