在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
文件在目的地。
以前看过,我不知道为什么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
}
我认为你可以删除整个正则表达式的东西,如果你使用参数'-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
虽然大多数投票的答案是完全有效的单个文件类型,如果需要复制多个文件类型有一个叫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
它创建一个新的文件夹中的部分是已经被记录在案[这里]一个bug(https://connect.microsoft.com/PowerShell/feedback/details/809855/subfolder-bug-with-command -copy项-C文件夹-C-文件夹2-递归 - 完成 - - 更多倍)。 – 2014-09-16 07:32:42