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

问题描述:

我试图将所有*.csproj.user文件从C:\Code\Trunk递归复制到C:\Code\F2在PowerShell中递归地将一组文件从一个目录复制到另一个目录

例如:

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

会得到复制到:

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

我现在的尝试是:

拷贝项目C:\代码\干线-Filter * .csproj.user -Destination C:\代码\ F2 -Recurse -WhatIf

但是我得到:

如果:执行操作 “复制目录” 目标“项目: C:\代码\干线目的地:C :\代码\ F2 \干线”。

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

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

更新:

好吧,这似乎有事可做的事实,C:\Code\F2已经存在。如果我尝试将文件复制到而不是存在的目标,它就可以工作。

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

+0

它创建一个新的文件夹中的部分是已经被记录在案[这里]一个bug(https://connect.microsoft.com/PowerShell/feedback/details/809855/subfolder-bug-with-command -copy项-C文件夹-C-文件夹2-递归 - 完成 - - 更多倍)。 – 2014-09-16 07:32:42

以前看过,我不知道为什么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 
} 
+0

我认为你可以删除整个正则表达式的东西,如果你使用参数'-LiteralPath'作为'Copy-Item'命令 – bitbonk 2017-02-23 13:03:33

答案1看起来不错,我改为Move-Item为我的目的。但是我发现在每个文件夹中它递归地通过,它只移动了第一个文件。下面是我完整的脚本,也包括PDF格式的的DOC文件的一些转换:

$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 
    } 
} 

你们使这种令人发指的复杂的,当它真的很简单:

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

将复制目录,在F2中创建一个“Trunk”目录。如果你想避免创建顶级干线文件夹,你必须停止告诉PowerShell来复制它:

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

第一条命令起作用了,并没有创建一个'Trunk'。 – CodeMed 2017-04-03 21:36:29

+0

没有人会梦想第一种方式是“告诉”它复制文件夹,因为“复制”是“复制项目”的别名,而DOS中的“复制”不能这样工作,如果我我没有错。因此许多人对此产生了困惑和困惑。 – as9876 2017-08-30 16:06:22

虽然大多数投票的答案是完全有效的单个文件类型,如果需要复制多个文件类型有一个叫ROBOCOPY更多有用的功能,正是为了这个目的用更简单的使用

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

我试图Jaykul答案,并没有为我工作。我不得不改变它如下来使它工作。在工作之前,我还创建了C:\ Code \ F2文件夹。

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