繁体   English   中英

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

[英]Recursively copy a set of files from one directory to another in PowerShell

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

例如:

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

将被复制到:

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

我目前的尝试是:

复制项目 C:\\Code\\Trunk -Filter *.csproj.user -Destination C:\\Code\\F2 -Recurse -WhatIf

但是我得到:

如果:在目标“项目:C:\\Code\\Trunk 目的地:C:\\Code\\F2\\Trunk”上执行“复制目录”操作。

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

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

更新:

好吧,好像和C:\\Code\\F2已经存在有关。 如果我尝试将文件复制到存在的目的地,它会起作用。

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

你们把这搞得异常复杂,其实很简单:

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

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

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

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

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

以前见过这个,我不知道为什么 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
}

我尝试了 Jaykul 的回答,但对我不起作用。 我必须按如下方式更改它才能使其正常工作。 在它工作之前,我还创建了 C:\\Code\\F2 文件夹。

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

答案 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
    }
}

最近我不得不替换存在于几个子文件夹中的一个文件,我做了如下。

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} 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM